diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 5228b0e383..73832cec65 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -228,7 +228,7 @@ cur_frm.cscript.hide_fields = function(doc) { par_flds = ['project_name', 'due_date', 'is_opening', 'source', 'total_advance', 'gross_profit', 'gross_profit_percent', 'get_advances_received', 'advance_adjustment_details', 'sales_partner', 'commission_rate', - 'total_commission', 'advances', 'period_from', 'period_to']; + 'total_commission', 'advances', 'from_date', 'to_date']; item_flds_normal = ['sales_order', 'delivery_note'] @@ -399,9 +399,9 @@ cur_frm.cscript.on_submit = function(doc, cdt, cdn) { }) } -cur_frm.cscript.convert_into_recurring_invoice = function(doc, dt, dn) { +cur_frm.cscript.is_recurring = function(doc, dt, dn) { // set default values for recurring invoices - if(doc.convert_into_recurring_invoice) { + if(doc.is_recurring) { var owner_email = doc.owner=="Administrator" ? frappe.user_info("Administrator").email : doc.owner; @@ -414,18 +414,18 @@ cur_frm.cscript.convert_into_recurring_invoice = function(doc, dt, dn) { refresh_many(["notification_email_address", "repeat_on_day_of_month"]); } -cur_frm.cscript.period_from = function(doc, dt, dn) { - // set period_to - if(doc.period_from) { +cur_frm.cscript.from_date = function(doc, dt, dn) { + // set to_date + if(doc.from_date) { var recurring_type_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12}; var months = recurring_type_map[doc.recurring_type]; if(months) { - var to_date = frappe.datetime.add_months(doc.period_from, + var to_date = frappe.datetime.add_months(doc.from_date, months); - doc.period_to = frappe.datetime.add_days(to_date, -1); - refresh_field('period_to'); + doc.to_date = frappe.datetime.add_days(to_date, -1); + refresh_field('to_date'); } } } diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 7cab4c24f0..c26583b737 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -173,9 +173,9 @@ "allow_on_submit": 1, "depends_on": "", "description": "Start date of current invoice's period", - "fieldname": "period_from", + "fieldname": "from_date", "fieldtype": "Date", - "label": "Invoice Period From", + "label": "From", "no_copy": 1, "permlevel": 0, "print_hide": 0, @@ -185,9 +185,9 @@ "allow_on_submit": 1, "depends_on": "", "description": "End date of current invoice's period", - "fieldname": "period_to", + "fieldname": "to_date", "fieldtype": "Date", - "label": "Invoice Period To", + "label": "To", "no_copy": 1, "permlevel": 0, "print_hide": 0, @@ -1088,9 +1088,9 @@ "allow_on_submit": 1, "depends_on": "eval:doc.docstatus<2", "description": "Check if recurring invoice, uncheck to stop recurring or put proper End Date", - "fieldname": "convert_into_recurring", + "fieldname": "is_recurring", "fieldtype": "Check", - "label": "Convert into Recurring Invoice", + "label": "Is Recurring", "no_copy": 1, "permlevel": 0, "print_hide": 1, @@ -1098,7 +1098,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "Select the period when the invoice will be generated automatically", "fieldname": "recurring_type", "fieldtype": "Select", @@ -1111,7 +1111,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The day of the month on which auto invoice will be generated e.g. 05, 28 etc ", "fieldname": "repeat_on_day_of_month", "fieldtype": "Int", @@ -1122,7 +1122,7 @@ "read_only": 0 }, { - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The date on which next invoice will be generated. It is generated on submit.\n", "fieldname": "next_date", "fieldtype": "Date", @@ -1134,7 +1134,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The date on which recurring invoice will be stop", "fieldname": "end_date", "fieldtype": "Date", @@ -1154,7 +1154,7 @@ "width": "50%" }, { - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The unique id for tracking all recurring invoices.\u00a0It is generated on submit.", "fieldname": "recurring_id", "fieldtype": "Data", @@ -1166,7 +1166,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "Enter email id separated by commas, invoice will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Small Text", @@ -1193,7 +1193,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-08-25 17:41:35.367233", + "modified": "2014-08-28 11:21:00.726344", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index fc72562565..a20d906b8c 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -14,7 +14,7 @@ from erpnext.accounts.party import get_party_account, get_due_date from erpnext.controllers.stock_controller import update_gl_entries_after from frappe.model.mapper import get_mapped_doc -month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12} +from erpnext.controllers.recurring_document import * from erpnext.controllers.selling_controller import SellingController @@ -75,7 +75,7 @@ class SalesInvoice(SellingController): self.set_against_income_account() self.validate_c_form() self.validate_time_logs_are_submitted() - self.validate_recurring_document() + validate_recurring_document(self) self.validate_multiple_billing("Delivery Note", "dn_detail", "amount", "delivery_note_details") @@ -103,7 +103,7 @@ class SalesInvoice(SellingController): self.update_c_form() self.update_time_log_batch(self.name) - self.convert_to_recurring("RECINV.#####", self.posting_date) + convert_to_recurring(self, "RECINV.#####", self.posting_date) def before_cancel(self): self.update_time_log_batch(None) @@ -144,8 +144,8 @@ class SalesInvoice(SellingController): }) def on_update_after_submit(self): - self.validate_recurring_document() - self.convert_to_recurring("RECINV.#####", self.posting_date) + validate_recurring_document(self) + convert_to_recurring(self, "RECINV.#####", self.posting_date) def get_portal_page(self): return "invoice" if self.docstatus==1 else None diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 4a23673630..4af9f5ed8a 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -430,30 +430,6 @@ class AccountsController(TransactionBase): return stock_items - def validate_recurring_document(self): - if self.convert_into_recurring: - self.validate_notification_email_id() - - if not self.recurring_type: - msgprint(_("Please select {0}").format(self.meta.get_label("recurring_type")), - raise_exception=1) - - elif not (self.period_from and self.period_to): - throw(_("Period From and Period To dates mandatory for recurring %s") % self.doctype) - - def convert_to_recurring(self, autoname, posting_date): - if self.convert_into_recurring: - if not self.recurring_id: - frappe.db.set(self, "recurring_id", - make_autoname(autoname)) - - self.set_next_date(posting_date) - - elif self.recurring_id: - frappe.db.sql("""update `tab%s` - set convert_into_recurring = 0 - where recurring_id = %s""" % (self.doctype, '%s'), (self.recurring_id)) - @property def company_abbr(self): if not hasattr(self, "_abbr"): @@ -470,36 +446,6 @@ class AccountsController(TransactionBase): if total_outstanding: frappe.get_doc('Account', account).check_credit_limit(total_outstanding) - def validate_notification_email_id(self): - if self.notification_email_address: - email_list = filter(None, [cstr(email).strip() for email in - self.notification_email_address.replace("\n", "").split(",")]) - - 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") \ - % self.doctype) - - def set_next_date(self, posting_date): - """ Set next date on which recurring document will be created""" - from erpnext.controllers.recurring_document import get_next_date - - month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12} - - if not self.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[self.recurring_type], - cint(self.repeat_on_day_of_month)) - - frappe.db.set(self, 'next_date', next_date) - - @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, "tax_rate") diff --git a/erpnext/controllers/recurring_document.py b/erpnext/controllers/recurring_document.py index d3c7809614..d9326792f3 100644 --- a/erpnext/controllers/recurring_document.py +++ b/erpnext/controllers/recurring_document.py @@ -13,6 +13,10 @@ from frappe.model.mapper import get_mapped_doc month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12} +def create_recurring_documents(): + manage_recurring_documents("Sales Order") + manage_recurring_documents("Sales Invoice") + def manage_recurring_documents(doctype, next_date=None, commit=True): """ Create recurring documents on specific date by copying the original one @@ -26,9 +30,9 @@ def manage_recurring_documents(doctype, next_date=None, commit=True): date_field = "posting_date" recurring_documents = frappe.db.sql("""select name, recurring_id - from `tab%s` where ifnull(convert_into_recurring, 0)=1 - and docstatus=1 and next_date=%s - and next_date <= ifnull(end_date, '2199-12-31')""" % (doctype, '%s'), (next_date)) + from `tab{}` where ifnull(is_recurring, 0)=1 + and docstatus=1 and next_date='{}' + and next_date <= ifnull(end_date, '2199-12-31')""".format(doctype, next_date)) exception_list = [] for ref_document, recurring_id in recurring_documents: @@ -47,7 +51,7 @@ def manage_recurring_documents(doctype, next_date=None, commit=True): frappe.db.begin() frappe.db.sql("update `tab%s` \ - set convert_into_recurring = 0 where name = %s" % (doctype, '%s'), + set is_recurring = 0 where name = %s" % (doctype, '%s'), (ref_document)) notify_errors(ref_document, doctype, ref_wrapper.customer, ref_wrapper.owner) frappe.db.commit() @@ -66,23 +70,23 @@ def make_new_document(ref_wrapper, date_field, posting_date): new_document = frappe.copy_doc(ref_wrapper) mcount = month_map[ref_wrapper.recurring_type] - period_from = get_next_date(ref_wrapper.period_from, mcount) + from_date = get_next_date(ref_wrapper.from_date, mcount) # get last day of the month to maintain period if the from date is first day of its own month # and to date is the last day of its own month - if (cstr(get_first_day(ref_wrapper.period_from)) == \ - cstr(ref_wrapper.period_from)) and \ - (cstr(get_last_day(ref_wrapper.period_to)) == \ - cstr(ref_wrapper.period_to)): - period_to = get_last_day(get_next_date(ref_wrapper.period_to, + if (cstr(get_first_day(ref_wrapper.from_date)) == \ + cstr(ref_wrapper.from_date)) and \ + (cstr(get_last_day(ref_wrapper.to_date)) == \ + cstr(ref_wrapper.to_date)): + to_date = get_last_day(get_next_date(ref_wrapper.to_date, mcount)) else: - period_to = get_next_date(ref_wrapper.period_to, mcount) + to_date = get_next_date(ref_wrapper.to_date, mcount) new_document.update({ date_field: posting_date, - "period_from": period_from, - "period_to": period_to, + "from_date": from_date, + "to_date": to_date, "fiscal_year": get_fiscal_year(posting_date)[0], "owner": ref_wrapper.owner, }) @@ -112,7 +116,7 @@ def send_notification(new_rv): message = _("Please find attached {0} #{1}").format(new_rv.doctype, new_rv.name), attachments = [{ "fname": new_rv.name + ".pdf", - "fcontent": frappe.get_print_format(new_rv.doctype, new_rv.name, as_pdf=True) + "fcontent": frappe.get_print_format(new_rv.doctype, new_rv.name, as_pdf=True).encode('utf-8') }]) def notify_errors(doc, doctype, customer, owner): @@ -121,7 +125,7 @@ def notify_errors(doc, doctype, customer, owner): frappe.sendmail(recipients + [frappe.db.get_value("User", owner, "email")], subject="[Urgent] Error while creating recurring %s for %s" % (doctype, doc), - message = frappe.get_template("templates/emails/recurring_sales_invoice_failed.html").render({ + message = frappe.get_template("templates/emails/recurring_document_failed.html").render({ "type": doctype, "name": doc, "customer": customer @@ -139,4 +143,55 @@ def assign_task_to_owner(doc, doctype, msg, users): 'description' : msg, 'priority' : 'High' } - assign_to.add(args) \ No newline at end of file + assign_to.add(args) + +def validate_recurring_document(doc): + if doc.is_recurring: + validate_notification_email_id(doc) + + if not doc.recurring_type: + msgprint(_("Please select {0}").format(doc.meta.get_label("recurring_type")), + raise_exception=1) + + elif not (doc.from_date and doc.to_date): + throw(_("Period From and Period To dates mandatory for recurring %s") % doc.doctype) + +def convert_to_recurring(doc, autoname, posting_date): + if doc.is_recurring: + if not doc.recurring_id: + frappe.db.set(doc, "recurring_id", + make_autoname(autoname)) + + set_next_date(doc, posting_date) + + elif doc.recurring_id: + frappe.db.sql("""update `tab%s` + set is_recurring = 0 + where recurring_id = %s""" % (doc.doctype, '%s'), (doc.recurring_id)) + +def validate_notification_email_id(doc): + if doc.notification_email_address: + email_list = filter(None, [cstr(email).strip() for email in + doc.notification_email_address.replace("\n", "").split(",")]) + + 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) + +def set_next_date(doc, posting_date): + """ Set next date on which recurring document will be created""" + from erpnext.controllers.recurring_document import get_next_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], + cint(doc.repeat_on_day_of_month)) + + frappe.db.set(doc, 'next_date', next_date) \ No newline at end of file diff --git a/erpnext/controllers/tests/test_recurring_document.py b/erpnext/controllers/tests/test_recurring_document.py index d31f6324bb..5332ae0541 100644 --- a/erpnext/controllers/tests/test_recurring_document.py +++ b/erpnext/controllers/tests/test_recurring_document.py @@ -16,14 +16,14 @@ def test_recurring_document(obj, test_records): base_doc = frappe.copy_doc(test_records[0]) base_doc.update({ - "convert_into_recurring": 1, + "is_recurring": 1, "recurring_type": "Monthly", "notification_email_address": "test@example.com, test1@example.com, test2@example.com", "repeat_on_day_of_month": getdate(today).day, "due_date": None, "fiscal_year": get_fiscal_year(today)[0], - "period_from": get_first_day(today), - "period_to": get_last_day(today) + "from_date": get_first_day(today), + "to_date": get_last_day(today) }) if base_doc.doctype == "Sales Order": @@ -50,8 +50,8 @@ def test_recurring_document(obj, test_records): # monthly without a first and last day period doc2 = frappe.copy_doc(base_doc) doc2.update({ - "period_from": today, - "period_to": add_to_date(today, days=30) + "from_date": today, + "to_date": add_to_date(today, days=30) }) doc2.insert() doc2.submit() @@ -61,8 +61,8 @@ def test_recurring_document(obj, test_records): doc3 = frappe.copy_doc(base_doc) doc3.update({ "recurring_type": "Quarterly", - "period_from": get_first_day(today), - "period_to": get_last_day(add_to_date(today, months=3)) + "from_date": get_first_day(today), + "to_date": get_last_day(add_to_date(today, months=3)) }) doc3.insert() doc3.submit() @@ -72,8 +72,8 @@ def test_recurring_document(obj, test_records): doc4 = frappe.copy_doc(base_doc) doc4.update({ "recurring_type": "Quarterly", - "period_from": today, - "period_to": add_to_date(today, months=3) + "from_date": today, + "to_date": add_to_date(today, months=3) }) doc4.insert() doc4.submit() @@ -83,8 +83,8 @@ def test_recurring_document(obj, test_records): doc5 = frappe.copy_doc(base_doc) doc5.update({ "recurring_type": "Yearly", - "period_from": get_first_day(today), - "period_to": get_last_day(add_to_date(today, years=1)) + "from_date": get_first_day(today), + "to_date": get_last_day(add_to_date(today, years=1)) }) doc5.insert() doc5.submit() @@ -94,8 +94,8 @@ def test_recurring_document(obj, test_records): doc6 = frappe.copy_doc(base_doc) doc6.update({ "recurring_type": "Yearly", - "period_from": today, - "period_to": add_to_date(today, years=1) + "from_date": today, + "to_date": add_to_date(today, years=1) }) doc6.insert() doc6.submit() @@ -138,23 +138,23 @@ def _test_recurring_document(obj, base_doc, date_field, first_and_last_day): new_doc = frappe.get_doc(base_doc.doctype, recurred_documents[0][0]) - for fieldname in ["convert_into_recurring", "recurring_type", + for fieldname in ["is_recurring", "recurring_type", "repeat_on_day_of_month", "notification_email_address"]: obj.assertEquals(base_doc.get(fieldname), new_doc.get(fieldname)) obj.assertEquals(new_doc.get(date_field), unicode(next_date)) - obj.assertEquals(new_doc.period_from, - unicode(add_months(base_doc.period_from, no_of_months))) + obj.assertEquals(new_doc.from_date, + unicode(add_months(base_doc.from_date, no_of_months))) if first_and_last_day: - obj.assertEquals(new_doc.period_to, - unicode(get_last_day(add_months(base_doc.period_to, + obj.assertEquals(new_doc.to_date, + unicode(get_last_day(add_months(base_doc.to_date, no_of_months)))) else: - obj.assertEquals(new_doc.period_to, - unicode(add_months(base_doc.period_to, no_of_months))) + obj.assertEquals(new_doc.to_date, + unicode(add_months(base_doc.to_date, no_of_months))) return new_doc diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 5466f2a0d8..b9e8451f18 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -64,7 +64,7 @@ scheduler_events = { "erpnext.selling.doctype.lead.get_leads.get_leads" ], "daily": [ - "erpnext.controllers.recurring_document.manage_recurring_documents" + "erpnext.controllers.recurring_document.create_recurring_documents" "erpnext.stock.utils.reorder_item", "erpnext.setup.doctype.email_digest.email_digest.send", "erpnext.support.doctype.support_ticket.support_ticket.auto_close_tickets" diff --git a/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py b/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py index 1ae3eb0764..a8303a0aae 100644 --- a/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py +++ b/erpnext/patches/v4_2/update_sales_order_invoice_field_name.py @@ -1,6 +1,6 @@ import frappe def execute(): - frappe.reload_doc('selling', 'doctype', 'sales_order') - frappe.db.sql("""update `tabSales Invoice` set period_from = order_period_from, - period_to = order_period_to, convert_into_recurring = convert_into_recurring_order""") + frappe.reload_doc('accounts', 'doctype', 'sales_invoice') + frappe.db.sql("""update `tabSales Invoice` set from_date = invoice_period_from_date, + to_date = invoice_period_to_date, is_recurring = convert_into_recurring_invoice""") diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 628e43e1df..4797230ad0 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -195,6 +195,37 @@ cur_frm.cscript.on_submit = function(doc, cdt, cdn) { } }; +cur_frm.cscript.is_recurring = function(doc, dt, dn) { + // set default values for recurring orders + if(doc.is_recurring) { + var owner_email = doc.owner=="Administrator" + ? frappe.user_info("Administrator").email + : doc.owner; + + doc.notification_email_address = $.map([cstr(owner_email), + cstr(doc.contact_email)], function(v) { return v || null; }).join(", "); + doc.repeat_on_day_of_month = frappe.datetime.str_to_obj(doc.posting_date).getDate(); + } + + refresh_many(["notification_email_address", "repeat_on_day_of_month"]); +} + +cur_frm.cscript.from_date = function(doc, dt, dn) { + // set to_date + if(doc.from_date) { + var recurring_type_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, + 'Yearly': 12}; + + var months = recurring_type_map[doc.recurring_type]; + if(months) { + var to_date = frappe.datetime.add_months(doc.from_date, + months); + doc.to_date = frappe.datetime.add_days(to_date, -1); + refresh_field('to_date'); + } + } +} + cur_frm.cscript.send_sms = function() { frappe.require("assets/erpnext/js/sms_manager.js"); var sms_man = new SMSManager(cur_frm.doc); diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index e418ee91db..a4b00ff8b6 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -173,18 +173,18 @@ { "allow_on_submit": 1, "description": "Start date of current order's period", - "fieldname": "period_from", + "fieldname": "from_date", "fieldtype": "Date", - "label": "Order Period From", + "label": "From", "no_copy": 1, "permlevel": 0 }, { "allow_on_submit": 1, "description": "End date of current order's period", - "fieldname": "period_to", + "fieldname": "to_date", "fieldtype": "Date", - "label": "Order Period To", + "label": "To", "no_copy": 1, "permlevel": 0 }, @@ -925,16 +925,16 @@ "allow_on_submit": 1, "depends_on": "eval:doc.docstatus<2", "description": "Check if recurring order, uncheck to stop recurring or put proper End Date", - "fieldname": "convert_into_recurring", + "fieldname": "is_recurring", "fieldtype": "Check", - "label": "Convert into Recurring Order", + "label": "Is Recurring", "no_copy": 1, "permlevel": 0, "print_hide": 1 }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "Select the period when the invoice will be generated automatically", "fieldname": "recurring_type", "fieldtype": "Select", @@ -946,7 +946,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The day of the month on which auto order will be generated e.g. 05, 28 etc ", "fieldname": "repeat_on_day_of_month", "fieldtype": "Int", @@ -956,7 +956,7 @@ "print_hide": 1 }, { - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The date on which next invoice will be generated. It is generated on submit.", "fieldname": "next_date", "fieldtype": "Date", @@ -968,7 +968,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "The date on which recurring order will be stop", "fieldname": "end_date", "fieldtype": "Date", @@ -985,7 +985,7 @@ "print_hide": 1 }, { - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "fieldname": "recurring_id", "fieldtype": "Data", "label": "Recurring Id", @@ -996,7 +996,7 @@ }, { "allow_on_submit": 1, - "depends_on": "eval:doc.convert_into_recurring==1", + "depends_on": "eval:doc.is_recurring==1", "description": "Enter email id separated by commas, order will be mailed automatically on particular date", "fieldname": "notification_email_address", "fieldtype": "Small Text", @@ -1021,7 +1021,7 @@ "idx": 1, "is_submittable": 1, "issingle": 0, - "modified": "2014-08-25 17:41:39.456399", + "modified": "2014-08-28 11:22:10.959416", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 37aca0a8ba..ff14f9d0c1 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -10,6 +10,8 @@ from frappe.utils import cstr, flt, getdate, comma_and from frappe import _ from frappe.model.mapper import get_mapped_doc +from erpnext.controllers.recurring_document import convert_to_recurring, validate_recurring_document + from erpnext.controllers.selling_controller import SellingController form_grid_templates = { @@ -120,7 +122,7 @@ class SalesOrder(SellingController): if not self.billing_status: self.billing_status = 'Not Billed' if not self.delivery_status: self.delivery_status = 'Not Delivered' - self.validate_recurring_document() + validate_recurring_document(self) def validate_warehouse(self): from erpnext.stock.utils import validate_warehouse_company @@ -164,7 +166,7 @@ class SalesOrder(SellingController): self.update_prevdoc_status('submit') frappe.db.set(self, 'status', 'Submitted') - self.convert_to_recurring("SO/REC/.#####", self.transaction_date) + convert_to_recurring(self, "SO/REC/.#####", self.transaction_date) def on_cancel(self): # Cannot cancel stopped SO @@ -254,8 +256,8 @@ class SalesOrder(SellingController): return "order" if self.docstatus==1 else None def on_update_after_submit(self): - self.validate_recurring_document() - self.convert_to_recurring("SO/REC/.#####", self.transaction_date) + validate_recurring_document(self) + convert_to_recurring(self, "SO/REC/.#####", self.transaction_date) @frappe.whitelist()