diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py index ef6f66ceec5..ebc6dd35158 100644 --- a/accounts/doctype/sales_invoice/sales_invoice.py +++ b/accounts/doctype/sales_invoice/sales_invoice.py @@ -728,24 +728,25 @@ def get_next_date(dt, mcount, day=None): next_month_date = datetime.date(year, month, last_day) 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 and notify the concerned people """ + next_date = next_date or nowdate() recurring_invoices = webnotes.conn.sql("""select name, recurring_id from `tabSales Invoice` where ifnull(convert_into_recurring_invoice, 0)=1 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 = [] for ref_invoice, recurring_id in recurring_invoices: if not webnotes.conn.sql("""select name from `tabSales Invoice` where posting_date=%s and recurring_id=%s and docstatus=1""", - (nowdate(), recurring_id)): + (next_date, recurring_id)): try: 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) webnotes.conn.commit() except Exception, e: @@ -765,19 +766,17 @@ def manage_recurring_invoices(): exception_message = "\n\n".join([cstr(d) for d in exception_list]) raise Exception, exception_message -def make_new_invoice(ref_wrapper): +def make_new_invoice(ref_wrapper, posting_date): from webnotes.model.wrapper import clone new_invoice = clone(ref_wrapper) 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))), "invoice_period_from_date": \ @@ -822,7 +821,9 @@ def send_notification(new_rv): ''' for d in getlist(new_rv.doclist, 'entries'): - tbl += '' + d.item_code +'' + d.description+'' + cstr(d.qty) +'' + cstr(d.basic_rate) +'' + cstr(d.amount) +'' + tbl += '' + cstr(d.item_code) +'' + cstr(d.description) + \ + '' + cstr(d.qty) +'' + cstr(d.basic_rate) + \ + '' + cstr(d.amount) +'' tbl += '' totals =''' diff --git a/stock/doctype/item/item.js b/stock/doctype/item/item.js index ca64d59ddbb..300d4eff128 100644 --- a/stock/doctype/item/item.js +++ b/stock/doctype/item/item.js @@ -138,4 +138,15 @@ cur_frm.fields_dict.item_customer_details.grid.get_field("customer_name").get_qu erpnext.utils.customer_query; cur_frm.fields_dict.item_supplier_details.grid.get_field("supplier").get_query = - erpnext.utils.supplier_query; \ No newline at end of file + erpnext.utils.supplier_query; + +cur_frm.cscript.on_remove_attachment = function(doc) { + // refresh image list before unsetting image + refresh_field("image"); + if(!inList(cur_frm.fields_dict.image.df.options.split("\n"), doc.image)) { + // if the selected image is removed from attachment, unset it + cur_frm.set_value("image", ""); + msgprint(wn._("Attachment removed. You may need to update: ") + + wn.meta.get_docfield(doc.doctype, "description_html").label); + } +}; \ No newline at end of file