Merge branch 'master' into develop
diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js
index da4a3b7..e36fa29 100644
--- a/erpnext/accounts/page/pos/pos.js
+++ b/erpnext/accounts/page/pos/pos.js
@@ -392,7 +392,7 @@
this.make_item_list();
this.make_discount_field()
},
-
+
make_control: function() {
this.frm = {}
this.frm.doc = this.doc
@@ -537,7 +537,7 @@
me.toggle_totals_area();
});
},
-
+
bind_numeric_keypad: function() {
var me = this;
$(this.numeric_keypad).find('.pos-operation').on('click', function(){
@@ -566,7 +566,7 @@
me.selected_field.closest('.pos-list-row').addClass('active');
}
})
-
+
$(this.numeric_keypad).find('.numeric-del').click(function(){
me.selected_field = $(me.wrapper).find('.selected-item').find('.' + me.numeric_id)
me.numeric_val = cstr(flt(me.selected_field.val())).slice(0, -1);
@@ -574,7 +574,7 @@
me.selected_field.trigger("change")
// me.render_selected_item()
})
-
+
$(this.numeric_keypad).find('.pos-pay').click(function(){
me.validate();
me.update_paid_amount_status(true);
@@ -982,7 +982,7 @@
})).tooltip().appendTo($wrap);
}
});
-
+
$wrap.append(`
<div class="image-view-item btn-more text-muted text-center">
<div class="image-view-body">
@@ -1064,7 +1064,7 @@
});
}
},
-
+
bind_items_event: function() {
var me = this;
$(this.wrapper).on('click', '.pos-bill-item', function() {
@@ -1101,7 +1101,7 @@
var qty = flt($(this).parents(".pos-bill-item").find('.pos-item-qty').val()) - 1;
me.update_qty(item_code, qty)
})
-
+
$(this.wrapper).on("change", ".pos-item-disc", function () {
var item_code = $(this).parents(".pos-selected-item-action").attr("data-item-code");
var discount = $(this).val();
@@ -1757,10 +1757,14 @@
mandatory_batch_no: function () {
var me = this;
if (this.items[0].has_batch_no && !this.item_batch_no[this.items[0].item_code]) {
- frappe.throw(__(repl("Error: Batch no is mandatory for item %(item)s", {
- 'item': this.items[0].item_code
- })))
- }
+ frappe.prompt([
+ {'fieldname': 'batch', 'fieldtype': 'Select', 'label': __('Batch No'), 'reqd': 1, 'options':this.batch_no_data[this.items[0].item_code]}
+ ],
+ function(values){
+ me.item_batch_no[me.items[0].item_code] = values.batch;
+ },
+ __('Select Batch No'))
+ }
},
apply_pricing_rule: function () {
@@ -1782,7 +1786,7 @@
item.pricing_rule = null;
me.apply_pricing_rule_on_item(item)
}
-
+
if(item.discount_percentage > 0) {
me.apply_pricing_rule_on_item(item)
}
diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py
index e6659f3..a37caea 100644
--- a/erpnext/crm/doctype/lead/lead.py
+++ b/erpnext/crm/doctype/lead/lead.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
from frappe import _
-from frappe.utils import (cstr, validate_email_add, cint, comma_and, has_gravatar, now)
+from frappe.utils import (cstr, validate_email_add, cint, comma_and, has_gravatar, now, getdate, nowdate)
from frappe.model.mapper import get_mapped_doc
from erpnext.controllers.selling_controller import SellingController
@@ -45,7 +45,7 @@
self.image = has_gravatar(self.email_id)
- if self.contact_date and self.contact_date < now():
+ if self.contact_date and getdate(self.contact_date) < getdate(nowdate()):
frappe.throw(_("Next Contact Date cannot be in the past"))
def on_update(self):
diff --git a/erpnext/docs/assets/img/setup/users/user-login-email.png b/erpnext/docs/assets/img/setup/users/user-login-email.png
new file mode 100644
index 0000000..71050af
--- /dev/null
+++ b/erpnext/docs/assets/img/setup/users/user-login-email.png
Binary files differ
diff --git a/erpnext/docs/assets/img/setup/users/user-login-mobile.png b/erpnext/docs/assets/img/setup/users/user-login-mobile.png
new file mode 100644
index 0000000..1d7af14
--- /dev/null
+++ b/erpnext/docs/assets/img/setup/users/user-login-mobile.png
Binary files differ
diff --git a/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md b/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md
index 053b4f1..b436b46 100644
--- a/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md
+++ b/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md
@@ -2,6 +2,8 @@
You can localize ERPNext to use particular timezone, date, number or currency format and also set global session expiry via System Settings.
+By checking the 'Allow Login using Mobile Number' checkbox, you can login to ERPNext using a valid mobile number set in your User account.
+
To open System Settings, go to:
> Setup > Settings > System Settings
diff --git a/erpnext/docs/user/manual/en/setting-up/users-and-permissions/adding-users.md b/erpnext/docs/user/manual/en/setting-up/users-and-permissions/adding-users.md
index 517c674..6fb64df 100644
--- a/erpnext/docs/user/manual/en/setting-up/users-and-permissions/adding-users.md
+++ b/erpnext/docs/user/manual/en/setting-up/users-and-permissions/adding-users.md
@@ -20,7 +20,10 @@
Add user details such as First Name, Last Name, Email etc.
-The user's Email will become the user id.
+The user's Email will become the user id. Mobile No can also be used to log in if you check the Allow Login using Mobile No checkbox under the Security section in System Settings. While Mobile No will be unique, it will not be treated as a user id.
+
+<img class="screenshot" src="{{docs_base_url}}/assets/img/setup/users/user-login-email.png" alt="Email Login">
+<img class="screenshot" src="{{docs_base_url}}/assets/img/setup/users/user-login-mobile.png" alt="Mobile No Login">
After adding these details, save the user.
diff --git a/erpnext/schools/doctype/course/course.js b/erpnext/schools/doctype/course/course.js
index f84c59f..c667eca 100644
--- a/erpnext/schools/doctype/course/course.js
+++ b/erpnext/schools/doctype/course/course.js
@@ -1,18 +1,30 @@
frappe.ui.form.on("Course", "refresh", function(frm) {
if(!cur_frm.doc.__islocal) {
frm.add_custom_button(__("Program"), function() {
+ frappe.route_options = {
+ "Program Course.course": frm.doc.name
+ }
frappe.set_route("List", "Program");
});
frm.add_custom_button(__("Student Group"), function() {
+ frappe.route_options = {
+ course: frm.doc.name
+ }
frappe.set_route("List", "Student Group");
});
frm.add_custom_button(__("Course Schedule"), function() {
+ frappe.route_options = {
+ course: frm.doc.name
+ }
frappe.set_route("List", "Course Schedule");
});
frm.add_custom_button(__("Assessment Plan"), function() {
+ frappe.route_options = {
+ course: frm.doc.name
+ }
frappe.set_route("List", "Assessment Plan");
});
}
diff --git a/erpnext/schools/doctype/program/program.js b/erpnext/schools/doctype/program/program.js
index cc09d0e..5146a19 100644
--- a/erpnext/schools/doctype/program/program.js
+++ b/erpnext/schools/doctype/program/program.js
@@ -6,22 +6,37 @@
frappe.ui.form.on("Program", "refresh", function(frm) {
if(!frm.doc.__islocal) {
frm.add_custom_button(__("Student Applicant"), function() {
+ frappe.route_options = {
+ program: frm.doc.name
+ }
frappe.set_route("List", "Student Applicant");
});
frm.add_custom_button(__("Program Enrollment"), function() {
+ frappe.route_options = {
+ program: frm.doc.name
+ }
frappe.set_route("List", "Program Enrollment");
});
frm.add_custom_button(__("Student Group"), function() {
+ frappe.route_options = {
+ program: frm.doc.name
+ }
frappe.set_route("List", "Student Group");
});
frm.add_custom_button(__("Fee Structure"), function() {
+ frappe.route_options = {
+ program: frm.doc.name
+ }
frappe.set_route("List", "Fee Structure");
});
frm.add_custom_button(__("Fees"), function() {
+ frappe.route_options = {
+ program: frm.doc.name
+ }
frappe.set_route("List", "Fees");
});
}
diff --git a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js b/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js
index 6f8c6cd..11a79e1 100644
--- a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js
+++ b/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js
@@ -4,6 +4,12 @@
frappe.ui.form.on('Student Attendance Tool', {
refresh: function(frm) {
+ if (frappe.route_options) {
+ frm.set_value("based_on", frappe.route_options.based_on);
+ frm.set_value("student_group", frappe.route_options.student_group);
+ frm.set_value("course_schedule", frappe.route_options.course_schedule);
+ frappe.route_options = null;
+ }
frm.disable_save();
},
diff --git a/erpnext/schools/doctype/student_group/student_group.js b/erpnext/schools/doctype/student_group/student_group.js
index ed94690..83fe094 100644
--- a/erpnext/schools/doctype/student_group/student_group.js
+++ b/erpnext/schools/doctype/student_group/student_group.js
@@ -13,11 +13,23 @@
refresh: function(frm) {
if (!frm.doc.__islocal) {
+ frm.add_custom_button(__("Attendance"), function() {
+ frappe.route_options = {
+ based_on: "Student Group",
+ student_group: frm.doc.name
+ }
+ frappe.set_route("List", "Student Attendance Tool");
+ });
frm.add_custom_button(__("Course Schedule"), function() {
+ frappe.route_options = {
+ student_group: frm.doc.name
+ }
frappe.set_route("List", "Course Schedule");
});
-
frm.add_custom_button(__("Assessment Plan"), function() {
+ frappe.route_options = {
+ student_group: frm.doc.name
+ }
frappe.set_route("List", "Assessment Plan");
});
frm.add_custom_button(__("Update Email Group"), function() {
@@ -30,6 +42,9 @@
});
});
frm.add_custom_button(__("Newsletter"), function() {
+ frappe.route_options = {
+ "Newsletter Email Group.email_group": frm.doc.name
+ }
frappe.set_route("List", "Newsletter");
});
}
diff --git a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json
index c5efdf8..ed782ad 100644
--- a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json
+++ b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json
@@ -13,6 +13,7 @@
"editable_grid": 0,
"fields": [
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -41,6 +42,67 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "column_break_2",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "description": "Attachments can be shown without enabling the shopping cart",
+ "fieldname": "show_attachments",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Show Public Attachments",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -68,6 +130,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -97,6 +160,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -128,6 +192,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -157,6 +222,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -184,6 +250,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -214,6 +281,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -242,6 +310,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
@@ -272,6 +341,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -301,6 +371,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -333,6 +404,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -361,6 +433,7 @@
"unique": 0
},
{
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -402,7 +475,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-03-21 15:42:08.574497",
+ "modified": "2017-05-19 09:31:38.078110",
"modified_by": "Administrator",
"module": "Shopping Cart",
"name": "Shopping Cart Settings",
diff --git a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py
index 4e24d2e..aa4f163 100644
--- a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py
+++ b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.py
@@ -89,3 +89,7 @@
if not get_shopping_cart_settings().enabled:
frappe.throw(_("You need to enable Shopping Cart"), ShoppingCartSetupError)
+def show_attachments():
+ return get_shopping_cart_settings().show_attachments
+
+
diff --git a/erpnext/templates/generators/item.html b/erpnext/templates/generators/item.html
index c0399a7..de54493 100644
--- a/erpnext/templates/generators/item.html
+++ b/erpnext/templates/generators/item.html
@@ -87,7 +87,7 @@
<table class="table borderless" style="width: 100%">
{% for d in website_specifications -%}
<tr>
- <td class="uppercase text-muted" style="width: 30%;">{{ d.label }}</td>
+ <td class="text-muted" style="width: 30%;">{{ d.label }}</td>
<td>{{ d.description }}</td>
</tr>
{%- endfor %}
diff --git a/erpnext/templates/pages/order.html b/erpnext/templates/pages/order.html
index 7129178..da9eb33 100644
--- a/erpnext/templates/pages/order.html
+++ b/erpnext/templates/pages/order.html
@@ -86,6 +86,24 @@
{% endif %}
{% endif %}
</div>
+
+{% if attachments %}
+<div class="order-item-table">
+ <div class="row order-items order-item-header text-muted">
+ <div class="col-sm-12 h6 text-uppercase">
+ {{ _("Attachments") }}
+ </div>
+ </div>
+ <div class="row order-items">
+ <div class="col-sm-12">
+ {% for attachment in attachments %}
+ <p class="small">
+ <a href="{{ attachment.file_url }}" target="blank"> {{ attachment.file_name }} </a>
+ </p>
+ {% endfor %}
+ </div>
+ </div>
</div>
-
+{% endif %}
+</div>
{% endblock %}
diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py
index 296b907..b453c7e 100644
--- a/erpnext/templates/pages/order.py
+++ b/erpnext/templates/pages/order.py
@@ -5,6 +5,7 @@
import frappe
from frappe import _
+from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import show_attachments
def get_context(context):
context.no_cache = 1
@@ -13,6 +14,9 @@
if hasattr(context.doc, "set_indicator"):
context.doc.set_indicator()
+ if show_attachments():
+ context.attachments = get_attachments(frappe.form_dict.doctype, frappe.form_dict.name)
+
context.parents = frappe.form_dict.parents
context.payment_ref = frappe.db.get_value("Payment Request",
{"reference_name": frappe.form_dict.name}, "name")
@@ -21,3 +25,7 @@
if not frappe.has_website_permission(context.doc):
frappe.throw(_("Not Permitted"), frappe.PermissionError)
+
+def get_attachments(dt, dn):
+ return frappe.get_all("File", fields=["name", "file_name", "file_url", "is_private"],
+ filters = {"attached_to_name": dn, "attached_to_doctype": dt, "is_private":0})