Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/erpnext/accounts/GL Mapper/Journal Voucher/Journal Voucher.txt b/erpnext/accounts/GL Mapper/Journal Voucher/Journal Voucher.txt
index b4a8cf6..fac3831 100644
--- a/erpnext/accounts/GL Mapper/Journal Voucher/Journal Voucher.txt
+++ b/erpnext/accounts/GL Mapper/Journal Voucher/Journal Voucher.txt
@@ -1 +1 @@
-[{'doc_type': 'Journal Voucher', 'modified_by': 'nabin@webnotestech.com', 'name': 'Journal Voucher', 'parent': None, 'creation': '2009-03-12 12:09:24', 'modified': '2010-04-30 17:56:41', 'module': 'Accounts', 'doctype': 'GL Mapper', 'idx': None, 'parenttype': None, 'owner': 'Administrator', 'docstatus': 0, 'parentfield': None}, {'creation': '2009-03-12 12:09:24', 'voucher_type': 'parent:doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': 'cost_center', 'voucher_no': 'parent:name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': "value:d.against_voucher or d.against_invoice or ''", 'table_field': 'entries', 'transaction_date': 'parent:voucher_date', 'debit': 'debit', 'docstatus': 0, 'parent': 'Journal Voucher', 'company': 'parent:company', 'aging_date': 'parent:aging_date', 'fiscal_year': 'parent:fiscal_year', 'is_advance': 'is_advance', 'remarks': 'parent:remark', 'account': 'account', 'name': 'GLMDetail00001', 'idx': 1, 'against_voucher_type': "value:(d.against_voucher and 'Payable Voucher') or (d.against_invoice and 'Receivable Voucher') or ''", 'modified': '2010-04-30 17:56:41', 'against': 'against_account', 'credit': 'credit', 'parenttype': 'GL Mapper', 'is_opening': 'parent:is_opening', 'posting_date': 'parent:posting_date', 'parentfield': 'fields'}, {'creation': '2009-06-11 11:09:11', 'voucher_type': 'doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': '', 'voucher_no': 'name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': '', 'table_field': '', 'transaction_date': 'voucher_date', 'debit': 'value:0', 'docstatus': 0, 'parent': 'Journal Voucher', 'company': 'company', 'aging_date': 'aging_date', 'fiscal_year': 'fiscal_year', 'is_advance': '', 'remarks': 'remark', 'account': 'tax_code', 'name': 'GLMDetail00009', 'idx': 2, 'against_voucher_type': None, 'modified': '2010-04-30 17:56:41', 'against': 'supplier_account', 'credit': 'ded_amount', 'parenttype': 'GL Mapper', 'is_opening': 'is_opening', 'posting_date': 'posting_date', 'parentfield': 'fields'}]
\ No newline at end of file
+[{'doc_type': 'Journal Voucher', 'modified_by': 'nabin@webnotestech.com', 'name': 'Journal Voucher', 'parent': None, 'creation': '2009-03-12 12:09:24', 'modified': '2010-04-30 17:56:41', 'module': 'Accounts', 'doctype': 'GL Mapper', 'idx': None, 'parenttype': None, 'owner': 'Administrator', 'docstatus': 0, 'parentfield': None}, {'creation': '2009-03-12 12:09:24', 'voucher_type': 'parent:doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': 'cost_center', 'voucher_no': 'parent:name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': "value:d.against_voucher or d.against_invoice or d.against_jv or ''", 'table_field': 'entries', 'transaction_date': 'parent:voucher_date', 'debit': 'debit', 'docstatus': 0, 'parent': 'Journal Voucher', 'company': 'parent:company', 'aging_date': 'parent:aging_date', 'fiscal_year': 'parent:fiscal_year', 'is_advance': 'is_advance', 'remarks': 'parent:remark', 'account': 'account', 'name': 'GLMDetail00001', 'idx': 1, 'against_voucher_type': "value:(d.against_voucher and 'Payable Voucher') or (d.against_invoice and 'Receivable Voucher') or (d.against_jv and 'Journal Voucher') or ''", 'modified': '2010-04-30 17:56:41', 'against': 'against_account', 'credit': 'credit', 'parenttype': 'GL Mapper', 'is_opening': 'parent:is_opening', 'posting_date': 'parent:posting_date', 'parentfield': 'fields'}, {'creation': '2009-06-11 11:09:11', 'voucher_type': 'doctype', 'doctype': 'GL Mapper Detail', 'owner': 'Administrator', 'cost_center': '', 'voucher_no': 'name', 'modified_by': 'nabin@webnotestech.com', 'against_voucher': '', 'table_field': '', 'transaction_date': 'voucher_date', 'debit': 'value:0', 'docstatus': 0, 'parent': 'Journal Voucher', 'company': 'company', 'aging_date': 'aging_date', 'fiscal_year': 'fiscal_year', 'is_advance': '', 'remarks': 'remark', 'account': 'tax_code', 'name': 'GLMDetail00009', 'idx': 2, 'against_voucher_type': None, 'modified': '2010-04-30 17:56:41', 'against': 'supplier_account', 'credit': 'ded_amount', 'parenttype': 'GL Mapper', 'is_opening': 'is_opening', 'posting_date': 'posting_date', 'parentfield': 'fields'}]
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
index 9e4baa1..536bb6d 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
@@ -645,30 +645,36 @@
 
 ########################################################################
 # Repair Outstanding
-#######################################################################
+
 	def repair_rv_outstanding(self):
 		get_obj(dt = 'GL Control').repair_voucher_outstanding(self)
 
+
+	#-------------------------------------------------------------------------------------
 	def on_update_after_submit(self):
 		self.convert_into_recurring()
 		
 
 	def convert_into_recurring(self):
 		if self.doc.convert_into_recurring_invoice:
-			event = 'accounts.doctype.gl_control.gl_control.manage_recurring_invoices'
 			self.set_next_date()
 			if not self.doc.recurring_id:
 				set(self.doc, 'recurring_id', make_autoname('RECINV/.#####'))
-
-			if sql("select name from `tabReceivable Voucher` where ifnull(convert_into_recurring_invoice, 0) = 1 and next_date <= end_date"):
-				if not self.check_event_exists(event):
-					set_event(event,  interval = 60*60, recurring = 1)
-			else:
-				cancel_event(event)
-
 		elif self.doc.recurring_id:
 			sql("""update `tabReceivable Voucher` set convert_into_recurring_invoice = 0 where recurring_id = %s""", self.doc.recurring_id)
 
+		self.manage_scheduler()
+
+	def manage_scheduler(self):
+		""" set/cancel event in scheduler """
+		event = 'accounts.doctype.gl_control.gl_control.manage_recurring_invoices'
+
+		if sql("select name from `tabReceivable Voucher` where ifnull(convert_into_recurring_invoice, 0) = 1 and next_date <= end_date"):
+			if not self.check_event_exists(event):
+				set_event(event,  interval = 60*60, recurring = 1)
+		else:
+			cancel_event(event)
+
 
 	def check_event_exists(self, event):
 		try:
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt
index 497c99f..c194e7c 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt
@@ -5,7 +5,7 @@
 	{
 		'creation': '2010-08-08 17:09:18',
 		'docstatus': 0,
-		'modified': '2011-12-20 18:23:36',
+		'modified': '2011-12-22 19:04:07',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
@@ -34,13 +34,12 @@
 		'server_code_error': ' ',
 		'show_in_menu': 0,
 		'subject': 'To %(customer_name)s worth %(currency)s %(grand_total_export)s due on %(due_date)s | %(outstanding_amount)s outstanding',
-		'version': 391
+		'version': 392
 	},
 
 	# These values are common for all DocFormat
 	{
 		'doctype': 'DocFormat',
-		'format': 'POS Invoice',
 		'name': '__common__',
 		'parent': 'Receivable Voucher',
 		'parentfield': 'formats',
@@ -126,7 +125,32 @@
 
 	# DocFormat
 	{
-		'doctype': 'DocFormat'
+		'doctype': 'DocFormat',
+		'format': 'POS Invoice'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'POS Invoice'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Sales Invoice Classic'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Sales Invoice Modern'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Sales Invoice Spartan'
 	},
 
 	# DocField
@@ -477,6 +501,7 @@
 		'label': 'Price List Currency',
 		'options': 'link:Currency',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
@@ -489,6 +514,7 @@
 		'fieldtype': 'Currency',
 		'label': 'Price List Currency Conversion Rate',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py
index 7612c19..84bfffb 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.py
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.py
@@ -248,7 +248,7 @@
 					raise Exception
 			
 			# list criteria that should not repeat if item is stock item
-			e = [d.schedule_date, d.item_code, d.warehouse, d.uom, d.fields.has_key('prevdoc_docname') and d.prevdoc_docname or '', d.fields.has_key('prevdoc_detail_docname') and d.prevdoc_detail_docname or '', d.fields.has_key('batch_no') and d.batch_no or '']
+			e = [d.schedule_date, d.item_code, d.description, d.warehouse, d.uom, d.fields.has_key('prevdoc_docname') and d.prevdoc_docname or '', d.fields.has_key('prevdoc_detail_docname') and d.prevdoc_detail_docname or '', d.fields.has_key('batch_no') and d.batch_no or '']
 			
 			# if is not stock item
 			f = [d.schedule_date, d.item_code, d.description]
@@ -258,16 +258,16 @@
 			if ch and ch[0][0] == 'Yes':			
 				# check for same items
 				if e in check_list:
-					msgprint("Item %s has been entered more than once with same schedule date, warehouse and uom." % d.item_code)
-					raise Exception
+					msgprint("""Item %s has been entered more than once with same description, schedule date, warehouse and uom.\n 
+						Please change any of the field value to enter the item twice""" % d.item_code, raise_exception = 1)
 				else:
 					check_list.append(e)
 					
 			elif ch and ch[0][0] == 'No':
 				# check for same items
 				if f in chk_dupl_itm:
-					msgprint("Item %s has been entered more than once." % d.item_code)
-					raise Exception
+					msgprint("""Item %s has been entered more than once with same description, schedule date.\n 
+						Please change any of the field value to enter the item twice.""" % d.item_code, raise_exception = 1)
 				else:
 					chk_dupl_itm.append(f)
 
diff --git a/erpnext/patches/print_hide_price_list.py b/erpnext/patches/print_hide_price_list.py
new file mode 100644
index 0000000..833ab98
--- /dev/null
+++ b/erpnext/patches/print_hide_price_list.py
@@ -0,0 +1,3 @@
+def execute():
+	import webnotes
+	webnotes.conn.sql("update `tabDocField` set print_hide = 1 where fieldname in ('price_list_currency', 'plc_conversion_rate')")
diff --git a/erpnext/patches/reload_gl_mapper.py b/erpnext/patches/reload_gl_mapper.py
new file mode 100644
index 0000000..edb00bc
--- /dev/null
+++ b/erpnext/patches/reload_gl_mapper.py
@@ -0,0 +1,6 @@
+def execute():
+	import webnotes
+	from webnotes.modules.module_manager import reload_doc
+	
+	# reload jv gl mapper
+	reload_doc('accounts', 'GL Mapper', 'Journal Voucher')
diff --git a/erpnext/patches/update_gle_against_voucher_for_jv.py b/erpnext/patches/update_gle_against_voucher_for_jv.py
new file mode 100644
index 0000000..5a03ec7
--- /dev/null
+++ b/erpnext/patches/update_gle_against_voucher_for_jv.py
@@ -0,0 +1,15 @@
+def execute():
+	import webnotes
+	from webnotes.model.code import get_obj
+	
+	# select jv where against_jv exists
+	jv = webnotes.conn.sql("select distinct parent from `tabJournal Voucher Detail` where docstatus = 1 and ifnull(against_jv, '') != ''")
+
+	for d in jv:
+		jv_obj = get_obj('Journal Voucher', d[0], with_children=1)
+
+		# cancel
+		get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =1, adv_adj = 1)
+
+		#re-submit
+		get_obj(dt='GL Control').make_gl_entries(jv_obj.doc, jv_obj.doclist, cancel =0, adv_adj = 1)
diff --git a/erpnext/projects/doctype/project_control/project_control.py b/erpnext/projects/doctype/project_control/project_control.py
index 82cb1c7..4b382a5 100644
--- a/erpnext/projects/doctype/project_control/project_control.py
+++ b/erpnext/projects/doctype/project_control/project_control.py
@@ -1,13 +1,13 @@
 # Please edit this list and import only required elements
 import webnotes
 
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, 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.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, set_default, str_esc_quote, user_format, validate_email_add, add_days
 from webnotes.model import db_exists
 from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
 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, is_testing, msgprint, errprint
-
+from webnotes.utils.email_lib import sendmail
 set = webnotes.conn.set
 sql = webnotes.conn.sql
 get_value = webnotes.conn.get_value
@@ -18,99 +18,127 @@
 
 
 class DocType:
-  def __init__(self,d,dl):
-    self.doc, self.doclist = d,dl
-  
-  def get_projects(self, arg):
-    # project list
-    pl=[]
-    status={}
-    if arg == 'Open':
-      pl = [p[0] for p in sql("select name from `tabProject` where status = 'Open' order by creation desc limit 20")]
-      for p1 in pl:
-        status[p1] = 'Open'
-    elif arg == 'Completed':
-      pl = [p[0] for p in sql("select name from `tabProject` where status = 'Completed' order by creation desc limit 20")]
-      for p2 in pl:
-        status[p2] = 'Completed'
-    elif arg == 'Cancelled':
-      pl = [p[0] for p in sql("select name from `tabProject` where status = 'Cancelled' order by creation desc limit 20")]
-      for p3 in pl:
-        status[p3] = 'Cancelled'
-    else:
-      #pl = [p[0] for p in sql("select name from `tabProject` order by creation desc limit 20")]
-      pl1 = sql("select name, status from `tabProject` order by creation desc limit 20", as_dict=1)
-      for p4 in pl1:
-        status[p4['name']] = p4['status']
-        pl.append(p4['name'])
-    
-    # milestones in the next 7 days for active projects
-    ml = convert_to_lists(sql("select t1.milestone_date, t1.milestone, t1.parent from `tabProject Milestone` t1, tabProject t2 where t1.parent = t2.name and t2.status='Open' and DATEDIFF(t1.milestone_date, CURDATE()) BETWEEN 0 AND 7 ORDER BY t1.milestone_date ASC"))
+	def __init__(self,d,dl):		
+		self.doc, self.doclist = d,dl
+	
+	def get_projects(self, arg):
+	# project list
+		pl=[]
+		status={}
+		if arg == 'Open':
+			pl = [p[0] for p in sql("select name from `tabProject` where status = 'Open' order by creation desc limit 20")]
+			for p1 in pl:
+				status[p1] = 'Open'
+		elif arg == 'Completed':
+			pl = [p[0] for p in sql("select name from `tabProject` where status = 'Completed' order by creation desc limit 20")]
+			for p2 in pl:
+				status[p2] = 'Completed'
+		elif arg == 'Cancelled':
+			pl = [p[0] for p in sql("select name from `tabProject` where status = 'Cancelled' order by creation desc limit 20")]
+			for p3 in pl:
+				status[p3] = 'Cancelled'
+		else:
+			#pl = [p[0] for p in sql("select name from `tabProject` order by creation desc limit 20")]
+			pl1 = sql("select name, status from `tabProject` order by creation desc limit 20", as_dict=1)
+			for p4 in pl1:
+				status[p4['name']] = p4['status']
+				pl.append(p4['name'])
+		
+		# milestones in the next 7 days for active projects
+		ml = convert_to_lists(sql("select t1.milestone_date, t1.milestone, t1.parent from `tabProject Milestone` t1, tabProject t2 where t1.parent = t2.name and t2.status='Open' and DATEDIFF(t1.milestone_date, CURDATE()) BETWEEN 0 AND 7 ORDER BY t1.milestone_date ASC"))
 
-    # percent of activity completed per project
-    comp = {}
-    n_tasks = {}
-    
-    for p in pl:
-      t1 = sql('select count(*) from tabTicket where project=%s and docstatus!=2', p)[0][0]
-      n_tasks[p] = t1 or 0
-      if t1:
-        t2 = sql('select count(*) from tabTicket where project=%s and docstatus!=2 and status="Closed"', p)[0][0]
-        comp[p] = cint(flt(t2)*100/t1)
-    
-    return {'pl':pl, 'ml':ml, 'comp':comp, 'n_tasks':n_tasks, 'status':status}
-    
-  def get_resources(self):
-    ret = {}
+		# percent of activity completed per project
+		comp = {}
+		n_tasks = {}
+		
+		for p in pl:
+			t1 = sql('select count(*) from tabTicket where project=%s and docstatus!=2', p)[0][0]
+			n_tasks[p] = t1 or 0
+			if t1:
+				t2 = sql('select count(*) from tabTicket where project=%s and docstatus!=2 and status="Closed"', p)[0][0]
+				comp[p] = cint(flt(t2)*100/t1)
+		
+		return {'pl':pl, 'ml':ml, 'comp':comp, 'n_tasks':n_tasks, 'status':status}
+		
+	def get_resources(self):
+		ret = {}
 
-    # resource list
-    rl = sql("select distinct allocated_to, assignee_email from tabTicket")
+		# resource list
+		rl = sql("select distinct allocated_to, assignee_email from tabTicket")
 
-    # get open & closed tickets
-    for r in rl:
-      if r[0]:
-        ret[r[1]] = {}
-        ret[r[1]]['id'] = r[0]
-        ret[r[1]]['Total'] = sql("select count(*) from tabTicket where allocated_to=%s and docstatus!=2", r[0])[0][0]
-        ret[r[1]]['Closed'] = sql("select count(*) from tabTicket where allocated_to=%s and status='Closed' and docstatus!=2", r[0])[0][0]
-        ret[r[1]]['percent'] = cint(flt(ret[r[1]]['Closed']) * 100 / ret[r[1]]['Total'])
+		# get open & closed tickets
+		for r in rl:
+			if r[0]:
+				ret[r[1]] = {}
+				ret[r[1]]['id'] = r[0]
+				ret[r[1]]['Total'] = sql("select count(*) from tabTicket where allocated_to=%s and docstatus!=2", r[0])[0][0]
+				ret[r[1]]['Closed'] = sql("select count(*) from tabTicket where allocated_to=%s and status='Closed' and docstatus!=2", r[0])[0][0]
+				ret[r[1]]['percent'] = cint(flt(ret[r[1]]['Closed']) * 100 / ret[r[1]]['Total'])
 
-    return ret
+		return ret
 
-  # --------------------------------------------------------------
-  # for Gantt Chart
+	# --------------------------------------------------------------
+	# for Gantt Chart
 
-  def get_init_data(self, arg=''):
-    pl = [p[0] for p in sql('select name from tabProject where docstatus != 2')]
-    rl = [p[0] for p in sql('select distinct allocated_to from tabTicket where docstatus != 2 and ifnull(allocated_to,"") != ""')]
-    return {'pl':pl, 'rl':rl}
+	def get_init_data(self, arg=''):
+		pl = [p[0] for p in sql('select name from tabProject where docstatus != 2')]
+		rl = [p[0] for p in sql('select distinct allocated_to from tabTicket where docstatus != 2 and ifnull(allocated_to,"") != ""')]
+		return {'pl':pl, 'rl':rl}
 
-  def get_tasks(self, arg):
-    start_date, end_date, project, resource = arg.split('~~~')
+	def get_tasks(self, arg):
+		start_date, end_date, project, resource = arg.split('~~~')
 
-    cl = ''
-    if project and project != 'All':
-      cl = " and ifnull(project,'') = '%s'" % project
+		cl = ''
+		if project and project != 'All':
+			cl = " and ifnull(project,'') = '%s'" % project
 
-    if resource and resource != 'All':
-      cl = " and ifnull(allocated_to,'') = '%s'" % resource
+		if resource and resource != 'All':
+			cl = " and ifnull(allocated_to,'') = '%s'" % resource
 
-    tl = sql("""
-      select subject, allocated_to, project, exp_start_date, exp_end_date, priority, status, name
-      from tabTicket 
-      where 
-        ((exp_start_date between '%(st)s' and '%(end)s') or 
-        (exp_end_date between '%(st)s' and '%(end)s') or 
-        (exp_start_date < '%(st)s' and exp_end_date > '%(end)s')) %(cond)s order by exp_start_date limit 100""" % {'st': start_date, 'end': end_date, 'cond':cl})
+		tl = sql("""
+			select subject, allocated_to, project, exp_start_date, exp_end_date, priority, status, name
+			from tabTicket 
+			where 
+				((exp_start_date between '%(st)s' and '%(end)s') or 
+				(exp_end_date between '%(st)s' and '%(end)s') or 
+				(exp_start_date < '%(st)s' and exp_end_date > '%(end)s')) %(cond)s order by exp_start_date limit 100""" % {'st': start_date, 'end': end_date, 'cond':cl})
 
-    return convert_to_lists(tl)
-  
-  def declare_proj_completed(self, arg):
-    chk = sql("select name from `tabTicket` where project=%s and status='Open'", arg)
-    if chk:
-      chk_lst = [x[0] for x in chk]
-      msgprint("Task(s) "+','.join(chk_lst)+" has staus 'Open'. Please submit all tasks against this project before closing the project.")
-      return cstr('false')
-    else:
-      sql("update `tabProject` set status = 'Completed' where name = %s", arg)
-      return cstr('true')
\ No newline at end of file
+		return convert_to_lists(tl)
+	
+	def declare_proj_completed(self, arg):
+		chk = sql("select name from `tabTicket` where project=%s and status='Open'", arg)
+		if chk:
+			chk_lst = [x[0] for x in chk]
+			msgprint("Task(s) "+','.join(chk_lst)+" has staus 'Open'. Please submit all tasks against this project before closing the project.")
+			return cstr('false')
+		else:
+			sql("update `tabProject` set status = 'Completed' where name = %s", arg)
+			return cstr('true')
+			
+			
+def sent_reminder_task():
+	task_list = sql("""
+		select subject, allocated_to, project, exp_start_date, exp_end_date,
+			priority, status, name, senders_name, opening_date, review_date, description 
+		from tabTicket
+		where task_email_notify=1 
+			and sent_reminder=0 
+			and status='Open' 
+			and exp_start_date is not null""",as_dict=1)
+	for i in task_list:		
+		if date_diff(i['exp_start_date'],nowdate()) ==2:
+			msg2="""<h2>Two days to complete: %(name)s</h2>
+			<p>This is a reminder for the task %(name)s has been assigned to you 
+				by %(senders_name)s on %(opening_date)s</p>
+			<p><b>Project:</b> %(project)s</p>
+			<p><b>Expected Start Date:</b> %(exp_start_date)s</p>
+			<p><b>Expected End Date:</b> %(exp_end_date)s</p>
+			<p><b>Review Date:</b> %(review_date)s</p>
+			<p><b>Details:</b> %(description)s</p>
+			<p>If you have already completed this task, please update the system</p>
+			<p>Good Luck!</p>
+			<p>(This notification is autogenerated)</p>""" % i
+			sendmail(i['allocated_to'], sender='automail@webnotestech.com', msg=msg2,send_now=1, \
+				subject='A task has been assigned')
+			sql("update `tabTicket` set sent_reminder='1' where name='%(name)s' and allocated_to= '%(allocated_to)s'" % i)	
+	
diff --git a/erpnext/projects/doctype/ticket/ticket.py b/erpnext/projects/doctype/ticket/ticket.py
index 4d3e988..4dbcfe7 100644
--- a/erpnext/projects/doctype/ticket/ticket.py
+++ b/erpnext/projects/doctype/ticket/ticket.py
@@ -1,12 +1,14 @@
 # Please edit this list and import only required elements
 import webnotes
 
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, 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.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, set_default, str_esc_quote, user_format, validate_email_add
+from webnotes.utils.email_lib import sendmail
 from webnotes.model import db_exists
 from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
 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, is_testing, msgprint, errprint
+
 sql = webnotes.conn.sql
 set = webnotes.conn.set
 get_value = webnotes.conn.get_value
@@ -15,161 +17,210 @@
 
 
 class DocType:
-  def __init__(self,doc,doclist=[]):
-    self.doc = doc
-    self.doclist = doclist
-  
-  def get_project_details(self):
-    cust = sql("select customer, customer_name from `tabProject` where name = %s", self.doc.project)
-    if cust:
-      ret = {'customer': cust and cust[0][0] or '', 'customer_name': cust and cust[0][1] or ''}
-      return ret
-  
-  def get_customer_details(self):
-    cust = sql("select customer_name from `tabCustomer` where name=%s", self.doc.customer)
-    if cust:
-      ret = {'customer_name': cust and cust[0][0] or ''}
-      return ret
-  
-  def get_allocated_to_name(self):
-    as_em = sql("select first_name, last_name from `tabProfile` where name=%s",str(self.doc.allocated_to))
-    ret = { 'allocated_to_name' : as_em and (as_em[0][0] + ' ' + as_em[0][1]) or ''}
-    return ret
+	def __init__(self,doc,doclist=[]):
+		self.doc = doc
+		self.doclist = doclist
+	
+	def get_project_details(self):
+		cust = sql("select customer, customer_name from `tabProject` where name = %s", self.doc.project)
+		if cust:
+			ret = {'customer': cust and cust[0][0] or '', 'customer_name': cust and cust[0][1] or ''}
+			return ret
+	
+	def get_customer_details(self):
+		cust = sql("select customer_name from `tabCustomer` where name=%s", self.doc.customer)
+		if cust:
+			ret = {'customer_name': cust and cust[0][0] or ''}
+			return ret
+	
+	def get_allocated_to_name(self):
+		as_em = sql("select first_name, last_name from `tabProfile` where name=%s",str(self.doc.allocated_to))
+		ret = { 'allocated_to_name' : as_em and (as_em[0][0] + ' ' + as_em[0][1]) or ''}
+		return ret
 
-  # validate
-  #--------------------------------------------   
+	# validate
+	#--------------------------------------------	 
 
 
-  def validate(self):
-    if not self.doc.opening_date:
-      msgprint("Please enter Opening Date.")
-      raise Exception
-    elif getdate(self.doc.opening_date) > getdate(nowdate()):
-      msgprint("Opening date can not be future date")
-      raise Exception
-    
-    if self.doc.exp_start_date and self.doc.exp_end_date and getdate(self.doc.exp_start_date) > getdate(self.doc.exp_end_date):
-      msgprint("'Expected Start Date' can not be greater than 'Expected End Date'")
-      raise Exception
-    
-    if self.doc.act_start_date and self.doc.act_end_date and getdate(self.doc.act_start_date) > getdate(self.doc.act_end_date):
-      msgprint("'Actual Start Date' can not be greater than 'Actual End Date'")
-      raise Exception
-    
-    if self.doc.opening_date and self.doc.review_date and getdate(self.doc.opening_date) > getdate(self.doc.review_date):
-      msgprint("Review Date should be greater than or equal to Opening Date ")
-      raise Exception
-    
-    if self.doc.closing_date and self.doc.review_date and getdate(self.doc.closing_date) < getdate(self.doc.review_date):
-      msgprint("Closing Date should be greater than or equal to Review Date ")
-      raise Exception
+	def validate(self):
+		if not self.doc.opening_date:
+			msgprint("Please enter Opening Date.")
+			raise Exception
+		elif getdate(self.doc.opening_date) > getdate(nowdate()):
+			msgprint("Opening date can not be future date")
+			raise Exception
+		
+		if self.doc.exp_start_date and self.doc.exp_end_date and getdate(self.doc.exp_start_date) > getdate(self.doc.exp_end_date):
+			msgprint("'Expected Start Date' can not be greater than 'Expected End Date'")
+			raise Exception
+		
+		if self.doc.act_start_date and self.doc.act_end_date and getdate(self.doc.act_start_date) > getdate(self.doc.act_end_date):
+			msgprint("'Actual Start Date' can not be greater than 'Actual End Date'")
+			raise Exception
+		
+		if self.doc.opening_date and self.doc.review_date and getdate(self.doc.opening_date) > getdate(self.doc.review_date):
+			msgprint("Review Date should be greater than or equal to Opening Date ")
+			raise Exception
+		
+		if self.doc.closing_date and self.doc.review_date and getdate(self.doc.closing_date) < getdate(self.doc.review_date):
+			msgprint("Closing Date should be greater than or equal to Review Date ")
+			raise Exception
 
-  # on update
-  #--------------------------------------------   
-  
-  def on_update(self):
-    if (self.doc.status =='Open') and (self.doc.task_email_notify==1):
-       	msg2= 'A task %s has been assigned to you by %s on %s <br/> \
-       	Project:%s <br/> Review Date:%s <br /> Closing Date:%s <br /> Details  %s' \
-       	%(self.doc.name,self.doc.senders_name,self.doc.opening_date,self.doc.project, \
-       	self.doc.review_date,self.doc.closing_date,self.doc.description)
-    	sendmail(self.doc.allocated_to, sender='automail@webnotestech.com', \
-    	subject='A task has been assigned', parts=[['text/plain',msg2]])
-    pass
-        
-  #validate before sending for approval
-  def validate_for_pending_review(self):
-    if not self.doc.allocated_to:
-      msgprint("Please enter allocated_to.")
-      raise Exception
-    self.validate_with_timesheet_dates()
-  
-  #validate before closing task
-  def validate_for_closed(self):
-    self.check_non_submitted_timesheets()
-    self.get_actual_total_hrs()
-  
-  def check_non_submitted_timesheets(self):
-    chk = sql("select t1.name from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent=t1.name and t2.task_id=%s and t1.status='Draft'", self.doc.name)
-    if chk:
-      chk_lst = [x[0] for x in chk]
-      msgprint("Please submit timesheet(s) : "+','.join(chk_lst)+" before declaring this task as completed. As details of this task present in timesheet(s)")
-      raise Exception
-  
-  #calculate actual total hours taken to complete task from timesheets
-  def get_actual_total_hrs(self):
-    import datetime
-    import time
-    chk = sql("select t2.act_total_hrs from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent = t1.name and t2.task_id = %s and t1.status = 'Submitted' and ifnull(t2.act_total_hrs, '')!='' order by t1.timesheet_date asc", self.doc.name)
-    if chk:
-      chk_lst = [x[0] for x in chk]
-      actual_total = total =0
-      
-      for m in chk_lst:
-        m1, m2=[], 0
-        m1 = m.split(":")
-        m2 = (datetime.timedelta(minutes=cint(m1[1]), hours=cint(m1[0]))).seconds
-        total = total + m2
-      
-      actual_total = time.strftime("%H:%M", time.gmtime(total))
-      set(self.doc, 'act_total_hrs', actual_total)
-  
-  # validate and fetch actual start and end date
-  def validate_with_timesheet_dates(self):
-    chk = sql("select t1.name, t1.timesheet_date from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent = t1.name and t2.task_id = %s and t1.status = 'Submitted' order by t1.timesheet_date asc", self.doc.name, as_dict=1)
-    if chk:
-      if self.doc.act_start_date:
-        if chk[0]['timesheet_date'] > getdate(self.doc.act_start_date) or chk[0]['timesheet_date'] < getdate(self.doc.act_start_date):
-          msgprint("Actual start date of this task is "+cstr(chk[0]['timesheet_date'])+" as per timesheet "+cstr(chk[0]['name']))
-          raise Exception
-      else:
-        self.doc.act_start_date = chk[0]['timesheet_date']
-      
-      if self.doc.act_end_date:
-        if chk[len(chk)-1]['timesheet_date'] < getdate(self.doc.act_end_date) or chk[len(chk)-1]['timesheet_date'] > getdate(self.doc.act_end_date):
-          msgprint("Actual end date of this task is "+cstr(chk[len(chk)-1]['timesheet_date'])+" as per timesheet "+cstr(chk[len(chk)-1]['name']))
-          raise Exception
-      else:
-        self.doc.act_end_date = chk[len(chk)-1]['timesheet_date']
-  
-  def set_for_review(self):
-    self.check_non_submitted_timesheets()
-    self.validate_for_pending_review()
-    self.get_actual_total_hrs()
-    self.doc.review_date = nowdate()
-    set(self.doc, 'status', 'Pending Review')
-    self.doc.save()
-    return cstr('true')
-  
-  def reopen_task(self):
-    set(self.doc, 'status', 'Open')
-    self.doc.save()
-    return cstr('true')
-  
-  def declare_completed(self):
-    if self.doc.status == 'Open':
-      self.validate_for_pending_review()
-      self.doc.review_date = nowdate()
-    else:
-      self.validate_with_timesheet_dates()
-    self.validate_for_closed()
-    self.doc.closing_date = nowdate()
-    set(self.doc, 'status', 'Closed')
-    set(self.doc, 'docstatus', 1)
-    self.doc.save()
-    return cstr('true')
-  
-  def cancel_task(self):
-    chk = sql("select distinct t1.name from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent = t1.name and t2.task_id = %s and t1.status!='Cancelled'", self.doc.name)
-    if chk:
-      chk_lst = [x[0] for x in chk]
-      msgprint("Timesheet(s) "+','.join(chk_lst)+" created against this task. Thus can not be cancelled")
-      raise Exception
-    else:
-      set(self.doc, 'status', 'Cancelled')
-      set(self.doc, 'docstatus', 2)
-    self.doc.save()
-    return cstr('true')
-  
-  def on_cancel(self):
-    self.cancel_task()
+	# on update
+	#--------------------------------------------	 
+	
+	def on_update(self):
+		if self.doc.status =='Open' and self.doc.allocated_to:
+			if self.doc.task_email_notify and (self.doc.allocated_to != self.doc.allocated_to_old):
+				self.doc.sent_reminder = 0
+				self.doc.allocated_to_old = self.doc.allocated_to
+				self.sent_notification()
+			if self.doc.exp_start_date:
+				sql("delete from tabEvent where ref_type='Task' and ref_name=%s", self.doc.name)
+				self.add_calendar_event()
+			else:
+				msgprint("An Expeted start date has not been set for this task.Please set a, 'Expected Start date'\
+				to add an event to allocated persons calender.You can save a task without this also.")
+			
+			
+	def validate_for_pending_review(self):
+		if not self.doc.allocated_to:
+			msgprint("Please enter allocated_to.")
+			raise Exception
+		self.validate_with_timesheet_dates()
+		
+	#Sent Notification
+	def sent_notification(self):
+		i = {
+			'name' : self.doc.name,
+			'senders_name': self.doc.allocated_to,
+			'opening_date': self.doc.opening_date,
+			'exp_start_date': self.doc.exp_start_date,
+			'exp_end_date' : self.doc.exp_end_date,
+			'project': self.doc.project,
+			'review_date': self.doc.review_date,
+			'description': self.doc.description
+		}
+
+		msg2="""<h2>%(name)s</h2>
+			<p>This is a Notification for the task %(name)s that has been assigned to you 
+				by %(senders_name)s on %(opening_date)s</p>
+			<p><b>Project:</b> %(project)s</p>
+			<p><b>Review Date:</b> %(review_date)s</p>
+			<p><b>Expected Start Date:</b> %(exp_start_date)s</p>
+			<p><b>Expected End Date:</b> %(exp_end_date)s</p>
+			<p><b>Details:</b> %(description)s</p>
+			<p>You will also recieve another reminder 2 days before the commencement of the task</p>
+			<p>Good Luck!</p>
+			<p>(This notification is autogenerated)</p>""" % i
+		sendmail(self.doc.allocated_to, sender='automail@webnotestech.com', msg=msg2,send_now=1,\
+			subject='A task has been assigned')
+
+
+	
+	#validate before closing task
+	def validate_for_closed(self):
+		self.check_non_submitted_timesheets()
+		self.get_actual_total_hrs()
+	
+	def check_non_submitted_timesheets(self):
+		chk = sql("select t1.name from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent=t1.name and t2.task_id=%s and t1.status='Draft'", self.doc.name)
+		if chk:
+			chk_lst = [x[0] for x in chk]
+			msgprint("Please submit timesheet(s) : "+','.join(chk_lst)+" before declaring this task as completed. As details of this task present in timesheet(s)")
+			raise Exception
+	
+	#calculate actual total hours taken to complete task from timesheets
+	def get_actual_total_hrs(self):
+		import datetime
+		import time
+		chk = sql("select t2.act_total_hrs from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent = t1.name and t2.task_id = %s and t1.status = 'Submitted' and ifnull(t2.act_total_hrs, '')!='' order by t1.timesheet_date asc", self.doc.name)
+		if chk:
+			chk_lst = [x[0] for x in chk]
+			actual_total = total =0
+			
+			for m in chk_lst:
+				m1, m2=[], 0
+				m1 = m.split(":")
+				m2 = (datetime.timedelta(minutes=cint(m1[1]), hours=cint(m1[0]))).seconds
+				total = total + m2
+			
+			actual_total = time.strftime("%H:%M", time.gmtime(total))
+			set(self.doc, 'act_total_hrs', actual_total)
+	
+	# validate and fetch actual start and end date
+	def validate_with_timesheet_dates(self):
+		chk = sql("select t1.name, t1.timesheet_date from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent = t1.name and t2.task_id = %s and t1.status = 'Submitted' order by t1.timesheet_date asc", self.doc.name, as_dict=1)
+		if chk:
+			if self.doc.act_start_date:
+				if chk[0]['timesheet_date'] > getdate(self.doc.act_start_date) or chk[0]['timesheet_date'] < getdate(self.doc.act_start_date):
+					msgprint("Actual start date of this task is "+cstr(chk[0]['timesheet_date'])+" as per timesheet "+cstr(chk[0]['name']))
+					raise Exception
+			else:
+				self.doc.act_start_date = chk[0]['timesheet_date']
+			
+			if self.doc.act_end_date:
+				if chk[len(chk)-1]['timesheet_date'] < getdate(self.doc.act_end_date) or chk[len(chk)-1]['timesheet_date'] > getdate(self.doc.act_end_date):
+					msgprint("Actual end date of this task is "+cstr(chk[len(chk)-1]['timesheet_date'])+" as per timesheet "+cstr(chk[len(chk)-1]['name']))
+					raise Exception
+			else:
+				self.doc.act_end_date = chk[len(chk)-1]['timesheet_date']
+	
+	def set_for_review(self):
+		self.check_non_submitted_timesheets()
+		self.validate_for_pending_review()
+		self.get_actual_total_hrs()
+		self.doc.review_date = nowdate()
+		self.doc.status = 'Pending Review'
+		self.doc.save()
+		return cstr('true')
+	
+	def reopen_task(self):
+		self.doc.status = 'Open'
+		self.doc.save()
+		return cstr('true')
+	
+	def declare_completed(self):
+		if self.doc.status == 'Open':
+			self.validate_for_pending_review()
+			self.doc.review_date = nowdate()
+		else:
+			self.validate_with_timesheet_dates()
+		self.validate_for_closed()
+
+		self.doc.closing_date = nowdate()
+		self.doc.status = 'Closed'
+		self.doc.docstatus = 1
+		self.doc.save()
+
+		self.remove_event_from_calender()
+		return cstr('true')
+		
+	def remove_event_from_calender(self):
+		sql("delete from tabEvent where ref_type='Task' and ref_name=%s", self.doc.name)
+		
+	def cancel_task(self):
+		chk = sql("select distinct t1.name from `tabTimesheet` t1, `tabTimesheet Detail` t2 where t2.parent = t1.name and t2.task_id = %s and t1.status!='Cancelled'", self.doc.name)
+		if chk:
+			chk_lst = [x[0] for x in chk]
+			msgprint("Timesheet(s) "+','.join(chk_lst)+" created against this task. Thus can not be cancelled")
+			raise Exception
+		else:
+			self.doc.status = 'Cancelled'
+			self.doc.docstatus = 2
+			self.remove_event_from_calender()
+		self.doc.save()
+		return cstr('true')
+
+	
+	def add_calendar_event(self):
+		""" Add calendar event for task in calendar of Allocated person"""
+		event = Document('Event')
+		event.owner = self.doc.allocated_to
+		event.description = self.doc.name 
+		event.event_date = self.doc.exp_start_date and self.doc.exp_start_date or ''
+		event.event_hour =  self.doc.event_hour and self.doc.event_hour or '10:00'
+		event.event_type = 'Private'
+		event.ref_type = 'Task'
+		event.ref_name = self.doc.name
+		event.save(1)
diff --git a/erpnext/projects/doctype/ticket/ticket.txt b/erpnext/projects/doctype/ticket/ticket.txt
index cd984ac..5b8da14 100644
--- a/erpnext/projects/doctype/ticket/ticket.txt
+++ b/erpnext/projects/doctype/ticket/ticket.txt
@@ -5,14 +5,14 @@
 	{
 		'creation': '2011-01-28 17:52:35',
 		'docstatus': 0,
-		'modified': '2011-12-21 16:32:30',
+		'modified': '2011-12-26 11:56:35',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
-		'_last_update': '1324394580',
+		'_last_update': '1324880734',
 		'allow_trash': 1,
 		'autoname': 'TIC/.####',
 		'colour': 'White:FFF',
@@ -26,7 +26,7 @@
 		'show_in_menu': 0,
 		'subject': '%(subject)s',
 		'tag_fields': 'status',
-		'version': 247
+		'version': 254
 	},
 
 	# These values are common for all DocField
@@ -140,15 +140,6 @@
 	# DocField
 	{
 		'doctype': 'DocField',
-		'fieldname': 'task_email_notify',
-		'fieldtype': 'Check',
-		'label': 'Sent Mail Notification',
-		'permlevel': 0
-	},
-
-	# DocField
-	{
-		'doctype': 'DocField',
 		'fieldname': 'opening_date',
 		'fieldtype': 'Date',
 		'label': 'Creation Date',
@@ -251,6 +242,17 @@
 
 	# DocField
 	{
+		'doctype': 'DocField',
+		'fieldname': 'allocated_to_old',
+		'fieldtype': 'Link',
+		'hidden': 1,
+		'label': 'Allocated To Old',
+		'no_copy': 1,
+		'permlevel': 0
+	},
+
+	# DocField
+	{
 		'colour': 'White:FFF',
 		'doctype': 'DocField',
 		'fieldname': 'allocated_to',
@@ -266,6 +268,15 @@
 	# DocField
 	{
 		'doctype': 'DocField',
+		'fieldname': 'task_email_notify',
+		'fieldtype': 'Check',
+		'label': 'Sent Mail Notification',
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
 		'fieldname': 'allocated_to_name',
 		'fieldtype': 'Data',
 		'hidden': 1,
@@ -278,6 +289,17 @@
 	# DocField
 	{
 		'doctype': 'DocField',
+		'fieldname': 'sent_reminder',
+		'fieldtype': 'Data',
+		'hidden': 1,
+		'label': 'Sent Reminder',
+		'no_copy': 1,
+		'permlevel': 0
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
 		'fieldname': 'senders_name',
 		'fieldtype': 'Data',
 		'in_filter': 1,
diff --git a/erpnext/selling/doctype/quotation/quotation.txt b/erpnext/selling/doctype/quotation/quotation.txt
index 86b7b5f..ac58dc4 100644
--- a/erpnext/selling/doctype/quotation/quotation.txt
+++ b/erpnext/selling/doctype/quotation/quotation.txt
@@ -5,11 +5,20 @@
 	{
 		'creation': '2010-08-08 17:09:17',
 		'docstatus': 0,
-		'modified': '2011-12-20 14:01:09',
+		'modified': '2011-12-22 19:03:04',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
 
+	# These values are common for all DocField
+	{
+		'doctype': 'DocField',
+		'name': '__common__',
+		'parent': 'Quotation',
+		'parentfield': 'fields',
+		'parenttype': 'DocType'
+	},
+
 	# These values are common for all DocType
 	{
 		'_last_update': '1322549700',
@@ -32,15 +41,15 @@
 		'show_in_menu': 0,
 		'subject': 'To %(customer_name)s on %(transaction_date)s worth %(currency)s %(grand_total_export)s',
 		'tag_fields': 'status',
-		'version': 597
+		'version': 598
 	},
 
-	# These values are common for all DocField
+	# These values are common for all DocFormat
 	{
-		'doctype': 'DocField',
+		'doctype': 'DocFormat',
 		'name': '__common__',
 		'parent': 'Quotation',
-		'parentfield': 'fields',
+		'parentfield': 'formats',
 		'parenttype': 'DocType'
 	},
 
@@ -169,6 +178,24 @@
 		'role': 'Maintenance User'
 	},
 
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Quotation Classic'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Quotation Modern'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Quotation Spartan'
+	},
+
 	# DocField
 	{
 		'colour': 'White:FFF',
@@ -568,6 +595,7 @@
 		'label': 'Price List Currency',
 		'options': 'link:Currency',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
@@ -580,6 +608,7 @@
 		'fieldtype': 'Currency',
 		'label': 'Price List Currency Conversion Rate',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.txt b/erpnext/selling/doctype/sales_order/sales_order.txt
index d59f236..2e6ea99 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.txt
+++ b/erpnext/selling/doctype/sales_order/sales_order.txt
@@ -5,11 +5,20 @@
 	{
 		'creation': '2010-08-08 17:09:21',
 		'docstatus': 0,
-		'modified': '2011-12-20 12:55:02',
+		'modified': '2011-12-22 19:03:25',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
 
+	# These values are common for all DocField
+	{
+		'doctype': 'DocField',
+		'name': '__common__',
+		'parent': 'Sales Order',
+		'parentfield': 'fields',
+		'parenttype': 'DocType'
+	},
+
 	# These values are common for all DocType
 	{
 		'_last_update': '1324295218',
@@ -29,15 +38,15 @@
 		'show_in_menu': 0,
 		'subject': 'From %(customer_name)s on %(transaction_date)s worth %(currency)s %(grand_total_export)s | %(per_delivered)s% delivered | %(per_billed)s% billed',
 		'tag_fields': 'delivery_status,billing_status',
-		'version': 608
+		'version': 609
 	},
 
-	# These values are common for all DocField
+	# These values are common for all DocFormat
 	{
-		'doctype': 'DocField',
+		'doctype': 'DocFormat',
 		'name': '__common__',
 		'parent': 'Sales Order',
-		'parentfield': 'fields',
+		'parentfield': 'formats',
 		'parenttype': 'DocType'
 	},
 
@@ -166,6 +175,24 @@
 		'role': 'Maintenance User'
 	},
 
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Sales Order Classic'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Sales Order Modern'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Sales Order Spartan'
+	},
+
 	# DocField
 	{
 		'colour': 'White:FFF',
@@ -581,6 +608,7 @@
 		'label': 'Price List Currency',
 		'options': 'link:Currency',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
@@ -593,6 +621,7 @@
 		'fieldtype': 'Currency',
 		'label': 'Price List Currency Conversion Rate',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.txt b/erpnext/stock/doctype/delivery_note/delivery_note.txt
index dc905f5..5340955 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.txt
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.txt
@@ -5,7 +5,7 @@
 	{
 		'creation': '2011-04-18 15:58:20',
 		'docstatus': 0,
-		'modified': '2011-12-20 13:23:33',
+		'modified': '2011-12-22 19:03:44',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
@@ -37,13 +37,12 @@
 		'show_in_menu': 0,
 		'subject': 'To %(customer_name)s on %(transaction_date)s | %(per_billed)s% billed',
 		'tag_fields': 'billing_status',
-		'version': 459
+		'version': 460
 	},
 
 	# These values are common for all DocFormat
 	{
 		'doctype': 'DocFormat',
-		'format': 'Delivery Note Packing List Wise',
 		'name': '__common__',
 		'parent': 'Delivery Note',
 		'parentfield': 'formats',
@@ -143,7 +142,26 @@
 
 	# DocFormat
 	{
-		'doctype': 'DocFormat'
+		'doctype': 'DocFormat',
+		'format': 'Delivery Note Packing List Wise'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Delivery Note Classic'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Delivery Note Modern'
+	},
+
+	# DocFormat
+	{
+		'doctype': 'DocFormat',
+		'format': 'Delivery Note Spartan'
 	},
 
 	# DocField
@@ -567,6 +585,7 @@
 		'label': 'Price List Currency',
 		'options': 'link:Currency',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},
 
@@ -579,6 +598,7 @@
 		'fieldtype': 'Currency',
 		'label': 'Price List Currency Conversion Rate',
 		'permlevel': 0,
+		'print_hide': 1,
 		'reqd': 1
 	},