diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 4a22de9e3cf..3bbf0822c3a 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2472,7 +2472,7 @@ "width": "50%" }, { - "allow_on_submit": 0, + "allow_on_submit": 1, "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", @@ -2490,7 +2490,7 @@ "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -2528,6 +2528,32 @@ "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", + "description": "Check to send it via Email, uncheck to generate a draft document only.", + "fieldname": "notify_by_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Notify by Email", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.notify_by_email==1", "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Code", @@ -2589,7 +2615,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-02-22 09:32:04.196291", + "modified": "2016-02-24 16:03:07.975604", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -2743,4 +2769,4 @@ "sort_order": "DESC", "timeline_field": "supplier", "title_field": "title" -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index ab486aa0701..7ac860172c5 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -3221,7 +3221,7 @@ "width": "50%" }, { - "allow_on_submit": 0, + "allow_on_submit": 1, "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", @@ -3239,7 +3239,7 @@ "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -3272,11 +3272,37 @@ "set_only_once": 0, "unique": 0 }, - { + { "allow_on_submit": 1, "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", + "description": "Check to send it via Email, uncheck to generate a draft document only.", + "fieldname": "notify_by_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Notify by Email", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.notify_by_email==1", "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Code", @@ -3364,7 +3390,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-02-22 09:34:35.695558", + "modified": "2016-02-24 15:56:43.416423", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -3459,4 +3485,4 @@ "sort_order": "DESC", "timeline_field": "customer", "title_field": "title" -} \ No newline at end of file +} diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index fb1781a417f..9c518d16b7f 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2523,7 +2523,7 @@ "unique": 0 }, { - "allow_on_submit": 0, + "allow_on_submit": 1, "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", @@ -2541,7 +2541,7 @@ "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -2578,6 +2578,32 @@ "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", + "description": "Check to send it via Email, uncheck to generate a draft document only.", + "fieldname": "notify_by_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Notify by Email", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.notify_by_email==1", "description": "Enter email id separated by commas, order will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Code", @@ -2638,7 +2664,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-02-22 09:32:53.191526", + "modified": "2016-02-25 09:51:38.479762", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", @@ -2772,4 +2798,4 @@ "sort_order": "DESC", "timeline_field": "supplier", "title_field": "title" -} \ No newline at end of file +} diff --git a/erpnext/controllers/recurring_document.py b/erpnext/controllers/recurring_document.py index 3ecbe5f119a..d02913280be 100644 --- a/erpnext/controllers/recurring_document.py +++ b/erpnext/controllers/recurring_document.py @@ -38,18 +38,19 @@ def manage_recurring_documents(doctype, next_date=None, commit=True): recurring_documents = frappe.db.sql("""select name, recurring_id from `tab{0}` where is_recurring=1 - and docstatus=1 and next_date=%s + and (docstatus=1 or docstatus=0) and next_date=%s and next_date <= ifnull(end_date, '2199-12-31') {1}""".format(doctype, condition), next_date) exception_list = [] for ref_document, recurring_id in recurring_documents: if not frappe.db.sql("""select name from `tab%s` - where %s=%s and recurring_id=%s and docstatus=1""" + where %s=%s and recurring_id=%s and (docstatus=1 or docstatus=0)""" % (doctype, date_field, '%s', '%s'), (next_date, recurring_id)): try: reference_doc = frappe.get_doc(doctype, ref_document) new_doc = make_new_document(reference_doc, date_field, next_date) - send_notification(new_doc) + if reference_doc.notify_by_email: + send_notification(new_doc) if commit: frappe.db.commit() except: @@ -92,7 +93,8 @@ def make_new_document(reference_doc, date_field, posting_date): date_field: posting_date, "from_date": from_date, "to_date": to_date, - "fiscal_year": get_fiscal_year(posting_date)[0] + "fiscal_year": get_fiscal_year(posting_date)[0], + "next_date": get_next_date(from_date, mcount,cint(reference_doc.repeat_on_day_of_month)) }) # copy document fields @@ -110,7 +112,11 @@ def make_new_document(reference_doc, date_field, posting_date): new_document.run_method("on_recurring", reference_doc=reference_doc) - new_document.submit() + if not reference_doc.notify_by_email: + new_document.docstatus=0 + new_document.insert() + else: + new_document.submit() return new_document @@ -181,18 +187,19 @@ def convert_to_recurring(doc, posting_date): # def validate_notification_email_id(doc): - if doc.notification_email_address: - email_list = split_emails(doc.notification_email_address.replace("\n", "")) + if doc.notify_by_email: + if doc.notification_email_address: + email_list = split_emails(doc.notification_email_address.replace("\n", "")) + + from frappe.utils import validate_email_add + for email in email_list: + if not validate_email_add(email): + throw(_("{0} is an invalid email address in 'Notification \ + Email Address'").format(email)) - from frappe.utils import validate_email_add - for email in email_list: - if not validate_email_add(email): - throw(_("{0} is an invalid email address in 'Notification \ - Email Address'").format(email)) - - else: - frappe.throw(_("'Notification Email Addresses' not specified for recurring %s") \ - % doc.doctype) + else: + frappe.throw(_("'Notification Email Addresses' not specified for recurring %s") \ + % doc.doctype) def set_next_date(doc, posting_date): """ Set next date on which recurring document will be created""" @@ -200,7 +207,7 @@ def set_next_date(doc, posting_date): if not doc.repeat_on_day_of_month: msgprint(_("Please enter 'Repeat on Day of Month' field value"), raise_exception=1) - next_date = get_next_date(posting_date, month_map[doc.recurring_type], + next_date = doc.next_date or get_next_date(doc.from_date, month_map[doc.recurring_type], cint(doc.repeat_on_day_of_month)) frappe.db.set(doc, 'next_date', next_date) diff --git a/erpnext/controllers/tests/test_recurring_document.py b/erpnext/controllers/tests/test_recurring_document.py index ef8d5fbf08e..0723f3d14a8 100644 --- a/erpnext/controllers/tests/test_recurring_document.py +++ b/erpnext/controllers/tests/test_recurring_document.py @@ -112,7 +112,7 @@ def _test_recurring_document(obj, base_doc, date_field, first_and_last_day): def _test(i): obj.assertEquals(i+1, frappe.db.sql("""select count(*) from `tab%s` - where recurring_id=%s and docstatus=1""" % (base_doc.doctype, '%s'), + where recurring_id=%s and (docstatus=1 or docstatus=0)""" % (base_doc.doctype, '%s'), (base_doc.recurring_id))[0][0]) next_date = get_next_date(base_doc.get(date_field), no_of_months, @@ -121,7 +121,7 @@ def _test_recurring_document(obj, base_doc, date_field, first_and_last_day): manage_recurring_documents(base_doc.doctype, next_date=next_date, commit=False) recurred_documents = frappe.db.sql("""select name from `tab%s` - where recurring_id=%s and docstatus=1 order by name desc""" + where recurring_id=%s and (docstatus=1 or docstatus=0) order by name desc""" % (base_doc.doctype, '%s'), (base_doc.recurring_id)) obj.assertEquals(i+2, len(recurred_documents)) diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 73c5d20451d..1be20311441 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2826,7 +2826,7 @@ "unique": 0 }, { - "allow_on_submit": 0, + "allow_on_submit": 1, "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", @@ -2844,7 +2844,7 @@ "permlevel": 0, "print_hide": 1, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -2881,6 +2881,32 @@ "bold": 0, "collapsible": 0, "depends_on": "eval:doc.is_recurring==1", + "description": "Check to send it via Email, uncheck to generate a draft document only.", + "fieldname": "notify_by_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Notify by Email", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.notify_by_email==1", "description": "Enter email id separated by commas, order will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Code", @@ -2941,7 +2967,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-02-22 09:35:08.094329", + "modified": "2016-02-24 16:10:47.732147", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", @@ -3116,4 +3142,4 @@ "sort_order": "DESC", "timeline_field": "customer", "title_field": "title" -} \ No newline at end of file +}