recurring invoice : quarterly, half-yearly and yearly
diff --git a/erpnext/accounts/doctype/gl_control/gl_control.py b/erpnext/accounts/doctype/gl_control/gl_control.py
index 2f84a9c..66a0d65 100644
--- a/erpnext/accounts/doctype/gl_control/gl_control.py
+++ b/erpnext/accounts/doctype/gl_control/gl_control.py
@@ -484,11 +484,13 @@
 		Create recurring invoices on specific date by copying the original one
 		and notify the concerned people
 	"""	
-	rv = webnotes.conn.sql("""select name, recurring_id from `tabSales Invoice` where ifnull(convert_into_recurring_invoice, 0) = 1 
-			and next_date = %s and next_date <= ifnull(end_date, '2199-12-31') and docstatus=1""", nowdate())
+	rv = webnotes.conn.sql("""select name, recurring_id from `tabSales Invoice` \
+		where ifnull(convert_into_recurring_invoice, 0) = 1 and next_date = %s \
+		and next_date <= ifnull(end_date, '2199-12-31') and docstatus=1""", nowdate())
 			
 	for d in rv:
-		if not webnotes.conn.sql("""select name from `tabSales Invoice` where posting_date = %s and recurring_id = %s and docstatus=1""", (nowdate(), d[1])):
+		if not webnotes.conn.sql("""select name from `tabSales Invoice` \
+			where posting_date = %s and recurring_id = %s and docstatus=1""", (nowdate(), d[1])):
 			prev_rv = get_obj('Sales Invoice', d[0], with_children=1)
 			new_rv = create_new_invoice(prev_rv)
 
@@ -499,13 +501,16 @@
 	# clone rv
 	new_rv = clone(prev_rv)
 
+	mdict = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12}
+	mcount = mdict[prev_rv.doc.recurring_type]
+
 	# update new rv 
 
 	new_rv.doc.posting_date = new_rv.doc.next_date
 	new_rv.doc.aging_date = new_rv.doc.next_date
 	new_rv.doc.due_date = add_days(new_rv.doc.next_date, cint(date_diff(prev_rv.doc.due_date, prev_rv.doc.posting_date)))
-	new_rv.doc.invoice_period_from_date = get_next_month_date(new_rv.doc.invoice_period_from_date)
-	new_rv.doc.invoice_period_to_date = get_next_month_date(new_rv.doc.invoice_period_to_date)
+	new_rv.doc.invoice_period_from_date = get_next_date(new_rv.doc.invoice_period_from_date, mcount)
+	new_rv.doc.invoice_period_to_date = get_next_date(new_rv.doc.invoice_period_to_date, mcount)
 	new_rv.doc.owner = prev_rv.doc.owner
 	new_rv.doc.save()
 
@@ -515,13 +520,13 @@
 
 	return new_rv
 
-def get_next_month_date(dt):
+def get_next_date(dt, mcount):
 	import datetime
-	m = getdate(dt).month + 1
+	m = getdate(dt).month + mcount
 	y = getdate(dt).year
 	d = getdate(dt).day
 	if m > 12:
-		m, y = 1, y+1
+		m, y = m-12, y+1
 	try:
 		next_month_date = datetime.date(y, m, d)
 	except:
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 7b62684..f07c7b3 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -686,7 +686,9 @@
 
 	def convert_into_recurring(self):
 		if self.doc.convert_into_recurring_invoice:
-			if not self.doc.invoice_period_from_date or not self.doc.invoice_period_to_date:
+			if not self.doc.recurring_type:
+				msgprint("Please select recurring type", raise_exception=1)
+			elif not self.doc.invoice_period_from_date or not self.doc.invoice_period_to_date:
 				msgprint("Invoice period from date and to date is mandatory for recurring invoice", raise_exception=1)
 			self.set_next_date()
 			if not self.doc.recurring_id:
@@ -702,10 +704,11 @@
 						will be generated e.g. 05, 28 etc.""", raise_exception=1)
 
 		import datetime
-		m = getdate(self.doc.posting_date).month + 1
+		mcount = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12}
+		m = getdate(self.doc.posting_date).month + mcount[self.doc.recurring_type]
 		y = getdate(self.doc.posting_date).year
 		if m > 12:
-			m, y = 1, y+1
+			m, y = m-12, y+1
 		try:
 			next_date = datetime.date(y, m, cint(self.doc.repeat_on_day_of_month))
 		except:
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
index d2439c8..9469941 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
@@ -3,9 +3,9 @@
 
 	# These values are common in all dictionaries
 	{
-		'creation': '2012-04-13 11:56:18',
+		'creation': '2012-06-11 12:09:54',
 		'docstatus': 0,
-		'modified': '2012-06-04 14:40:59',
+		'modified': '2012-06-17 21:37:36',
 		'modified_by': u'Administrator',
 		'owner': u'Administrator'
 	},
@@ -1484,6 +1484,21 @@
 	{
 		'allow_on_submit': 1,
 		'depends_on': u'eval:doc.convert_into_recurring_invoice==1',
+		'description': u'Select the period when the invoice will be generated automatically',
+		'doctype': u'DocField',
+		'fieldname': u'recurring_type',
+		'fieldtype': u'Select',
+		'label': u'Recurring Type',
+		'no_copy': 1,
+		'options': u'Monthly\nQuarterly\nHalf-yearly\nYearly',
+		'permlevel': 0,
+		'print_hide': 1
+	},
+
+	# DocField
+	{
+		'allow_on_submit': 1,
+		'depends_on': u'eval:doc.convert_into_recurring_invoice==1',
 		'description': u'The day of the month on which auto invoice will be generated e.g. 05, 28 etc ',
 		'doctype': u'DocField',
 		'fieldname': u'repeat_on_day_of_month',