Fix minor errors, fix patch, call in hooks, move from account_controller to recurring_document

This commit is contained in:
ankitjavalkarwork 2014-08-27 19:10:10 +05:30
parent 28a975dd32
commit aaac7c17b8
11 changed files with 172 additions and 138 deletions

View File

@ -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');
}
}
}

View File

@ -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",

View File

@ -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

View File

@ -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")

View File

@ -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)
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)

View File

@ -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

View File

@ -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"

View File

@ -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""")

View File

@ -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);

View File

@ -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",

View File

@ -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()