From 8eadf09e991e632197f9dd9da8319cc5eb78f16e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sun, 17 Jun 2012 21:48:33 +0530 Subject: [PATCH] recurring invoice : quarterly, half-yearly and yearly --- .../accounts/doctype/gl_control/gl_control.py | 21 ++++++++++++------- .../doctype/sales_invoice/sales_invoice.py | 9 +++++--- .../doctype/sales_invoice/sales_invoice.txt | 19 +++++++++++++++-- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/gl_control/gl_control.py b/erpnext/accounts/doctype/gl_control/gl_control.py index 2f84a9c7f4..66a0d65b74 100644 --- a/erpnext/accounts/doctype/gl_control/gl_control.py +++ b/erpnext/accounts/doctype/gl_control/gl_control.py @@ -484,11 +484,13 @@ def manage_recurring_invoices(): 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 @@ def create_new_invoice(prev_rv): # 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 @@ def create_new_invoice(prev_rv): 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 7b62684db9..f07c7b3ffc 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -686,7 +686,9 @@ class DocType(TransactionBase): 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 @@ class DocType(TransactionBase): 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 d2439c8113..94699413a6 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' }, @@ -1480,6 +1480,21 @@ 'trigger': u'Client' }, + # DocField + { + '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,