Merge branch 'master' into production
This commit is contained in:
commit
9ea22b75bd
@ -719,7 +719,7 @@ def get_next_date(dt, mcount, day=None):
|
|||||||
if not day:
|
if not day:
|
||||||
day = getdate(dt).day
|
day = getdate(dt).day
|
||||||
if month > 12:
|
if month > 12:
|
||||||
month, year = m-12, y+1
|
month, year = month-12, year+1
|
||||||
try:
|
try:
|
||||||
next_month_date = datetime.date(year, month, day)
|
next_month_date = datetime.date(year, month, day)
|
||||||
except:
|
except:
|
||||||
@ -728,24 +728,25 @@ def get_next_date(dt, mcount, day=None):
|
|||||||
next_month_date = datetime.date(year, month, last_day)
|
next_month_date = datetime.date(year, month, last_day)
|
||||||
return next_month_date.strftime("%Y-%m-%d")
|
return next_month_date.strftime("%Y-%m-%d")
|
||||||
|
|
||||||
def manage_recurring_invoices():
|
def manage_recurring_invoices(next_date=None):
|
||||||
"""
|
"""
|
||||||
Create recurring invoices on specific date by copying the original one
|
Create recurring invoices on specific date by copying the original one
|
||||||
and notify the concerned people
|
and notify the concerned people
|
||||||
"""
|
"""
|
||||||
|
next_date = next_date or nowdate()
|
||||||
recurring_invoices = webnotes.conn.sql("""select name, recurring_id
|
recurring_invoices = webnotes.conn.sql("""select name, recurring_id
|
||||||
from `tabSales Invoice` where ifnull(convert_into_recurring_invoice, 0)=1
|
from `tabSales Invoice` where ifnull(convert_into_recurring_invoice, 0)=1
|
||||||
and docstatus=1 and next_date=%s
|
and docstatus=1 and next_date=%s
|
||||||
and next_date <= ifnull(end_date, '2199-12-31')""", nowdate())
|
and next_date <= ifnull(end_date, '2199-12-31')""", next_date)
|
||||||
|
|
||||||
exception_list = []
|
exception_list = []
|
||||||
for ref_invoice, recurring_id in recurring_invoices:
|
for ref_invoice, recurring_id in recurring_invoices:
|
||||||
if not webnotes.conn.sql("""select name from `tabSales Invoice`
|
if not webnotes.conn.sql("""select name from `tabSales Invoice`
|
||||||
where posting_date=%s and recurring_id=%s and docstatus=1""",
|
where posting_date=%s and recurring_id=%s and docstatus=1""",
|
||||||
(nowdate(), recurring_id)):
|
(next_date, recurring_id)):
|
||||||
try:
|
try:
|
||||||
ref_wrapper = webnotes.model_wrapper('Sales Invoice', ref_invoice)
|
ref_wrapper = webnotes.model_wrapper('Sales Invoice', ref_invoice)
|
||||||
new_invoice_wrapper = make_new_invoice(ref_wrapper)
|
new_invoice_wrapper = make_new_invoice(ref_wrapper, next_date)
|
||||||
send_notification(new_invoice_wrapper)
|
send_notification(new_invoice_wrapper)
|
||||||
webnotes.conn.commit()
|
webnotes.conn.commit()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@ -765,19 +766,17 @@ def manage_recurring_invoices():
|
|||||||
exception_message = "\n\n".join([cstr(d) for d in exception_list])
|
exception_message = "\n\n".join([cstr(d) for d in exception_list])
|
||||||
raise Exception, exception_message
|
raise Exception, exception_message
|
||||||
|
|
||||||
def make_new_invoice(ref_wrapper):
|
def make_new_invoice(ref_wrapper, posting_date):
|
||||||
from webnotes.model.wrapper import clone
|
from webnotes.model.wrapper import clone
|
||||||
new_invoice = clone(ref_wrapper)
|
new_invoice = clone(ref_wrapper)
|
||||||
|
|
||||||
mcount = month_map[ref_wrapper.doc.recurring_type]
|
mcount = month_map[ref_wrapper.doc.recurring_type]
|
||||||
|
|
||||||
today = nowdate()
|
|
||||||
|
|
||||||
new_invoice.doc.fields.update({
|
|
||||||
"posting_date": today,
|
|
||||||
"aging_date": today,
|
|
||||||
|
|
||||||
"due_date": add_days(today, cint(date_diff(ref_wrapper.doc.due_date,
|
new_invoice.doc.fields.update({
|
||||||
|
"posting_date": posting_date,
|
||||||
|
"aging_date": posting_date,
|
||||||
|
|
||||||
|
"due_date": add_days(posting_date, cint(date_diff(ref_wrapper.doc.due_date,
|
||||||
ref_wrapper.doc.posting_date))),
|
ref_wrapper.doc.posting_date))),
|
||||||
|
|
||||||
"invoice_period_from_date": \
|
"invoice_period_from_date": \
|
||||||
@ -911,4 +910,4 @@ def get_bank_cash_account(mode_of_payment):
|
|||||||
webnotes.msgprint("Default Bank / Cash Account not set in Mode of Payment: %s. Please add a Default Account in Mode of Payment master." % mode_of_payment)
|
webnotes.msgprint("Default Bank / Cash Account not set in Mode of Payment: %s. Please add a Default Account in Mode of Payment master." % mode_of_payment)
|
||||||
return {
|
return {
|
||||||
"cash_bank_account": val
|
"cash_bank_account": val
|
||||||
}
|
}
|
||||||
|
@ -57,17 +57,18 @@ erpnext.startup.start = function() {
|
|||||||
var today = dateutil.str_to_obj(wn.boot.server_date);
|
var today = dateutil.str_to_obj(wn.boot.server_date);
|
||||||
var expires_on = dateutil.str_to_obj(wn.boot.expires_on);
|
var expires_on = dateutil.str_to_obj(wn.boot.expires_on);
|
||||||
var diff = dateutil.get_diff(expires_on, today);
|
var diff = dateutil.get_diff(expires_on, today);
|
||||||
|
var payment_link = "<a href=\"https://erpnext.com/modes-of-payment.html\" target=\"_blank\">See Payment Options.</a>";
|
||||||
if (0 <= diff && diff <= 15) {
|
if (0 <= diff && diff <= 15) {
|
||||||
var expiry_string = diff==0 ? "today" : repl("in %(diff)s day(s)", { diff: diff });
|
var expiry_string = diff==0 ? "today" : repl("in %(diff)s day(s)", { diff: diff });
|
||||||
$('header').append(repl('<div class="expiry-info"> \
|
$('header').append(repl('<div class="expiry-info"> \
|
||||||
Your ERPNext subscription will <b>expire %(expiry_string)s</b>. \
|
Your ERPNext subscription will <b>expire %(expiry_string)s</b>. \
|
||||||
Please renew your subscription to continue using ERPNext \
|
Please renew your subscription to continue using ERPNext \
|
||||||
(and remove this annoying banner). \
|
(and remove this annoying banner). %(payment_link)s\
|
||||||
</div>', { expiry_string: expiry_string }));
|
</div>', { expiry_string: expiry_string, payment_link: payment_link }));
|
||||||
} else if (diff < 0) {
|
} else if (diff < 0) {
|
||||||
$('header').append(repl('<div class="expiry-info"> \
|
$('header').append(repl('<div class="expiry-info"> \
|
||||||
This ERPNext subscription <b>has expired</b>. \
|
This ERPNext subscription <b>has expired</b>. %(payment_link)s\
|
||||||
</div>', { expiry_string: expiry_string }));
|
</div>', { expiry_string: expiry_string, payment_link: payment_link }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
erpnext.set_about();
|
erpnext.set_about();
|
||||||
@ -179,4 +180,4 @@ erpnext.setup_mousetrap = function() {
|
|||||||
// start
|
// start
|
||||||
$(document).bind('startup', function() {
|
$(document).bind('startup', function() {
|
||||||
erpnext.startup.start();
|
erpnext.startup.start();
|
||||||
});
|
});
|
||||||
|
@ -51,7 +51,7 @@ class DocType:
|
|||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
def get_permissions(self,doctype):
|
def get_permissions(self,doctype):
|
||||||
import webnotes.model.doctype
|
import webnotes.model.doctype
|
||||||
doclist = webnotes.model.doctype.get(doctype)
|
doclist = webnotes.model.doctype.get(doctype).get_parent_doclist()
|
||||||
|
|
||||||
ptype = [{
|
ptype = [{
|
||||||
'role': perm.role,
|
'role': perm.role,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user