Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index a8894c5..bc36f58 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -25,9 +25,8 @@
this.frm.set_df_property("debit_to", "print_hide", 0);
}
}
-
// if(this.frm.doc.is_pos && this.frm.doc.docstatus===0) {
- // cur_frm.cscript.toggle_pos(true);
+ // cur_frm.cscript.toggle_pos(true);
// }
},
diff --git a/hr/doctype/employee/employee.js b/hr/doctype/employee/employee.js
index 92dc7f9..9ee7c61 100644
--- a/hr/doctype/employee/employee.js
+++ b/hr/doctype/employee/employee.js
@@ -30,11 +30,12 @@
return this.frm.call({
method:"hr.utils.get_leave_approver_list",
callback: function(r) {
- me.frm.fields_dict.employee_leave_approvers.grid
- .get_field("leave_approver").df.options =
- $.map(r.message, function(profile) {
- return {value: profile, label: wn.user_info(profile).fullname};
- });
+ var df = wn.meta.get_docfield("Employee Leave Approver", "leave_approver",
+ me.frm.doc.name);
+ df.options = $.map(r.message, function(profile) {
+ return {value: profile, label: wn.user_info(profile).fullname};
+ });
+ me.frm.fields_dict.employee_leave_approvers.refresh();
}
});
},
diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js
index 8726403..4c7d356 100755
--- a/hr/doctype/leave_application/leave_application.js
+++ b/hr/doctype/leave_application/leave_application.js
@@ -10,7 +10,6 @@
cur_frm.set_value("status", "Open");
cur_frm.cscript.calculate_total_days(doc, dt, dn);
}
- cur_frm.set_df_property("leave_approver", "options", "");
return cur_frm.call({
method:"hr.utils.get_leave_approver_list",
callback: function(r) {
diff --git a/patches/august_2013/p01_hr_settings.py b/patches/august_2013/p01_hr_settings.py
index 302611b..d34ef52 100644
--- a/patches/august_2013/p01_hr_settings.py
+++ b/patches/august_2013/p01_hr_settings.py
@@ -1,6 +1,7 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
# License: GNU General Public License v3. See license.txt
+from __future__ import unicode_literals
import webnotes
def execute():
diff --git a/public/js/transaction.js b/public/js/transaction.js
index 7a1dc0c..67204f3 100644
--- a/public/js/transaction.js
+++ b/public/js/transaction.js
@@ -32,6 +32,21 @@
}
},
+ onload_post_render: function() {
+ if(this.frm.doc.__islocal && this.frm.doc.company && !this.frm.doc.customer) {
+ var me = this;
+ return this.frm.call({
+ doc: this.frm.doc,
+ method: "onload_post_render",
+ freeze: true,
+ callback: function(r) {
+ // remove this call when using client side mapper
+ me.set_default_values();
+ }
+ });
+ }
+ },
+
refresh: function() {
this.frm.clear_custom_buttons();
erpnext.hide_naming_series();
@@ -44,6 +59,17 @@
this.calculate_taxes_and_totals();
},
+ set_default_values: function() {
+ $.each(wn.model.get_doclist(this.frm.doctype, this.frm.docname), function(i, doc) {
+ var updated = wn.model.set_default_values(doc);
+ if(doc.parentfield) {
+ refresh_field(doc.parentfield);
+ } else {
+ refresh_field(updated);
+ }
+ });
+ },
+
company: function() {
if(this.frm.doc.company && this.frm.fields_dict.currency) {
if(!this.frm.doc.currency) {
diff --git a/setup/doctype/global_defaults/global_defaults.txt b/setup/doctype/global_defaults/global_defaults.txt
index 8f5b940..fbfa8ca 100644
--- a/setup/doctype/global_defaults/global_defaults.txt
+++ b/setup/doctype/global_defaults/global_defaults.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-02 17:53:24",
"docstatus": 0,
- "modified": "2013-08-02 13:45:12",
+ "modified": "2013-08-06 11:22:22",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -71,7 +71,8 @@
"read_only": 0
},
{
- "description": "Precision for Float fields (quantities, discounts, percentages etc) only for display. Floats will still be calculated up to 6 decimals.",
+ "default": "3",
+ "description": "Precision for Float fields (quantities, discounts, percentages etc). Floats will be rounded up to specified decimals. Default = 3",
"doctype": "DocField",
"fieldname": "float_precision",
"fieldtype": "Select",
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 26b7f25..679d743 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -289,6 +289,9 @@
if d['reserved_qty'] < 0 :
# Reduce reserved qty from reserved warehouse mentioned in so
+ if not d["reserved_warehouse"]:
+ webnotes.throw(_("Reserved Warehouse is missing in Sales Order"))
+
args = {
"item_code": d['item_code'],
"voucher_type": self.doc.doctype,
diff --git a/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py b/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
index 6ecfe7a..4d42c22 100644
--- a/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
+++ b/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py
@@ -29,8 +29,8 @@
"""return columns based on filters"""
columns = ["Item:Link/Item:100", "Item Name::150", "Description::150", \
- "Warehouse:Link/Warehouse:100", "Opening Qty::90", \
- "In Qty::80", "Out Qty::80", "Balance Qty::90", "Company:Link/Company:100"]
+ "Warehouse:Link/Warehouse:100", "Opening Qty:Float:90", \
+ "In Qty:Float:80", "Out Qty:Float:80", "Balance Qty:Float:90", "Company:Link/Company:100"]
return columns
diff --git a/support/doctype/newsletter/newsletter.js b/support/doctype/newsletter/newsletter.js
index 8cbf8fc..0531196 100644
--- a/support/doctype/newsletter/newsletter.js
+++ b/support/doctype/newsletter/newsletter.js
@@ -1,6 +1,17 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
// License: GNU General Public License v3. See license.txt
+cur_frm.cscript.onload = function(doc) {
+ return wn.call({
+ method: "support.doctype.newsletter.newsletter.get_lead_options",
+ type: "GET",
+ callback: function(r) {
+ set_field_options("lead_source", r.message.sources.join("\n"))
+ set_field_options("lead_status", r.message.statuses.join("\n"))
+ }
+ });
+}
+
cur_frm.cscript.refresh = function(doc) {
erpnext.hide_naming_series();
if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved
@@ -11,18 +22,42 @@
});
})
}
+
+ cur_frm.cscript.setup_dashboard();
if(doc.__islocal && !doc.send_from) {
cur_frm.set_value("send_from",
repl("%(fullname)s <%(email)s>", wn.user_info(doc.owner)));
}
-
- return wn.call({
- method: "support.doctype.newsletter.newsletter.get_lead_options",
- type: "GET",
- callback: function(r) {
- set_field_options("lead_source", r.message.sources.join("\n"))
- set_field_options("lead_status", r.message.statuses.join("\n"))
+}
+
+cur_frm.cscript.setup_dashboard = function() {
+ cur_frm.dashboard.reset();
+ if(!cur_frm.doc.__islocal && cint(cur_frm.doc.email_sent) && cur_frm.doc.__status_count) {
+ var stat = cur_frm.doc.__status_count;
+ var total = wn.utils.sum($.map(stat, function(v) { return v; }));
+ if(total) {
+ $.each(stat, function(k, v) {
+ stat[k] = flt(v * 100 / total, 2);
+ });
+
+ cur_frm.dashboard.add_progress("Status", [
+ {
+ title: stat["Sent"] + "% Sent",
+ width: stat["Sent"],
+ progress_class: "progress-bar-success"
+ },
+ {
+ title: stat["Sending"] + "% Sending",
+ width: stat["Sending"],
+ progress_class: "progress-bar-warning"
+ },
+ {
+ title: stat["Error"] + "% Error",
+ width: stat["Error"],
+ progress_class: "progress-bar-danger"
+ }
+ ]);
}
- })
+ }
}
\ No newline at end of file
diff --git a/support/doctype/newsletter/newsletter.py b/support/doctype/newsletter/newsletter.py
index cdfd370..b201cc5 100644
--- a/support/doctype/newsletter/newsletter.py
+++ b/support/doctype/newsletter/newsletter.py
@@ -11,6 +11,12 @@
class DocType():
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
+
+ def onload(self):
+ if self.doc.email_sent:
+ self.doc.fields["__status_count"] = dict(webnotes.conn.sql("""select status, count(*)
+ from `tabBulk Email` where ref_doctype=%s and ref_docname=%s
+ group by status""", (self.doc.doctype, self.doc.name))) or None
def test_send(self, doctype="Lead"):
self.recipients = self.doc.test_email_id.split(",")
@@ -74,7 +80,8 @@
send(recipients = self.recipients, sender = sender,
subject = self.doc.subject, message = self.doc.message,
- doctype = self.send_to_doctype, email_field = "email_id")
+ doctype = self.send_to_doctype, email_field = "email_id",
+ ref_doctype = self.doc.doctype, ref_docname = self.doc.name)
webnotes.conn.auto_commit_on_many_writes = False
@@ -91,8 +98,10 @@
@webnotes.whitelist()
def get_lead_options():
return {
- "sources": ["All"] + webnotes.conn.sql_list("""select distinct source from tabLead"""),
- "statuses": ["All"]+ webnotes.conn.sql_list("""select distinct status from tabLead""")
+ "sources": ["All"] + filter(None,
+ webnotes.conn.sql_list("""select distinct source from tabLead""")),
+ "statuses": ["All"] + filter(None,
+ webnotes.conn.sql_list("""select distinct status from tabLead"""))
}
diff --git a/website/helpers/blog.py b/website/helpers/blog.py
index 005bdb8..f8f7a42 100644
--- a/website/helpers/blog.py
+++ b/website/helpers/blog.py
@@ -41,7 +41,7 @@
import webnotes.utils
for res in result:
- from webnotes.utils import global_date_format, get_fullname
+ from webnotes.utils import global_date_format
res['published'] = global_date_format(res['creation'])
if not res['content']:
res['content'] = webnotes.webutils.get_html(res['page_name'])
@@ -101,28 +101,11 @@
doctype='Comment',
email_field='comment_by',
subject='New Comment on Blog: ' + blog.title,
- message='%(comment)s<p>By %(comment_by_fullname)s</p>' % args)
+ message='%(comment)s<p>By %(comment_by_fullname)s</p>' % args,
+ ref_doctype='Blog Post', ref_docname=blog.name)
return comment_html.replace("\n", "")
-@webnotes.whitelist(allow_guest=True)
-def add_subscriber(name, email_id):
- """add blog subscriber to lead"""
- name = webnotes.conn.sql("""select name from tabLead where email_id=%s""", email)
-
- from webnotes.model.doc import Document
- if name:
- lead = Document('Lead', name[0][0])
- else:
- lead = Document('Lead')
-
- if not lead.source: lead.source = 'Blog'
- lead.unsubscribed = 0
- lead.blog_subscriber = 1
- lead.lead_name = name
- lead.email_id = email
- lead.save()
-
def get_blog_content(blog_page_name):
import webnotes.webutils
content = webnotes.webutils.get_html(blog_page_name)