From 7a9bd41a7267025e1d9413aec7d5275d632f1dcd Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 16:18:27 +0530 Subject: [PATCH 01/28] Improved currency exchange rate message --- erpnext/setup/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 55a0fd3c011..46e4d5c4f58 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -91,8 +91,7 @@ def get_exchange_rate(from_currency, to_currency, transaction_date=None): response.raise_for_status() value = response.json()["rates"][to_currency] cache.setex(key, value, 6 * 60 * 60) - return flt(value) except: - frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}").format(from_currency, to_currency, transaction_date)) + frappe.msgprint(_("Unable to find exchange rate for {0} to {1} for key date {2}. Please create a Currency Exchange record manually").format(from_currency, to_currency, transaction_date)) return 0.0 \ No newline at end of file From 2d79a641c27159ee263f9233e117343bb54b7b69 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 12:41:14 +0530 Subject: [PATCH 02/28] Annual billing amount in party dashboard based on grand total --- erpnext/accounts/party.py | 37 ++++++++++++++++++-- erpnext/buying/doctype/supplier/supplier.py | 23 ++---------- erpnext/selling/doctype/customer/customer.py | 21 ++--------- 3 files changed, 40 insertions(+), 41 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index f0c29bc36ef..d54b5b9e85c 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -7,10 +7,13 @@ import frappe import datetime from frappe import _, msgprint, scrub from frappe.defaults import get_user_permissions -from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff, add_years, get_timestamp +from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff, \ + add_years, get_timestamp, nowdate from frappe.geo.doctype.address.address import get_address_display, get_default_address from frappe.email.doctype.contact.contact import get_contact_details, get_default_contact from erpnext.exceptions import PartyFrozen, InvalidCurrency, PartyDisabled, InvalidAccountCurrency +from erpnext.accounts.utils import get_fiscal_year +from erpnext import get_default_currency class DuplicatePartyAccountError(frappe.ValidationError): pass @@ -359,4 +362,34 @@ def get_timeline_data(doctype, name): timestamp = get_timestamp(date) out.update({ timestamp: count }) - return out \ No newline at end of file + return out + +def get_dashboard_info(party_type, party): + current_fiscal_year = get_fiscal_year(nowdate(), as_dict=True) + party_account_currency = get_party_account_currency(party_type, party, frappe.db.get_default("company")) + company_default_currency = get_default_currency() + + if party_account_currency==company_default_currency: + total_field = "base_grand_total" + else: + total_field = "grand_total" + + doctype = "Sales Invoice" if party_type=="Customer" else "Purchase Invoice" + + billing_this_year = frappe.db.sql(""" + select sum({0}) + from `tab{1}` + where {2}=%s and docstatus=1 and posting_date between %s and %s + """.format(total_field, doctype, party_type.lower()), + (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date)) + + total_unpaid = frappe.db.sql("""select sum(outstanding_amount) + from `tab{0}` + where {1}=%s and docstatus = 1""".format(doctype, party_type.lower()), party) + + info = {} + info["billing_this_year"] = billing_this_year[0][0] if billing_this_year else 0 + info["currency"] = party_account_currency + info["total_unpaid"] = total_unpaid[0][0] if total_unpaid else 0 + + return info \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py index 704e8285b1f..3b6ae620d16 100644 --- a/erpnext/buying/doctype/supplier/supplier.py +++ b/erpnext/buying/doctype/supplier/supplier.py @@ -6,11 +6,9 @@ import frappe import frappe.defaults from frappe import msgprint, _ from frappe.model.naming import make_autoname -from frappe.geo.address_and_contact import (load_address_and_contact, - delete_contact_and_address) - +from frappe.geo.address_and_contact import load_address_and_contact, delete_contact_and_address from erpnext.utilities.transaction_base import TransactionBase -from erpnext.accounts.party import validate_party_accounts, get_timeline_data # keep this +from erpnext.accounts.party import validate_party_accounts, get_dashboard_info, get_timeline_data # keep this class Supplier(TransactionBase): def get_feed(self): @@ -22,22 +20,7 @@ class Supplier(TransactionBase): self.load_dashboard_info() def load_dashboard_info(self): - billing_this_year = frappe.db.sql(""" - select sum(credit_in_account_currency) - sum(debit_in_account_currency) - from `tabGL Entry` - where voucher_type='Purchase Invoice' and party_type = 'Supplier' - and party=%s and fiscal_year = %s""", - (self.name, frappe.db.get_default("fiscal_year"))) - - total_unpaid = frappe.db.sql("""select sum(outstanding_amount) - from `tabPurchase Invoice` - where supplier=%s and docstatus = 1""", self.name) - - - info = {} - info["billing_this_year"] = billing_this_year[0][0] if billing_this_year else 0 - info["total_unpaid"] = total_unpaid[0][0] if total_unpaid else 0 - + info = get_dashboard_info(self.doctype, self.name) self.set_onload('dashboard_info', info) def autoname(self): diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index e4101af4bfc..c0b3b847750 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -10,8 +10,7 @@ from frappe.utils import flt, cint, cstr from frappe.desk.reportview import build_match_conditions from erpnext.utilities.transaction_base import TransactionBase from frappe.geo.address_and_contact import load_address_and_contact, delete_contact_and_address -from erpnext.accounts.party import validate_party_accounts, get_timeline_data # keep this -from erpnext import get_default_currency +from erpnext.accounts.party import validate_party_accounts, get_dashboard_info, get_timeline_data # keep this class Customer(TransactionBase): def get_feed(self): @@ -23,25 +22,9 @@ class Customer(TransactionBase): self.load_dashboard_info() def load_dashboard_info(self): - billing_this_year = frappe.db.sql(""" - select sum(debit_in_account_currency) - sum(credit_in_account_currency), account_currency - from `tabGL Entry` - where voucher_type='Sales Invoice' and party_type = 'Customer' - and party=%s and fiscal_year = %s""", - (self.name, frappe.db.get_default("fiscal_year"))) - - total_unpaid = frappe.db.sql("""select sum(outstanding_amount) - from `tabSales Invoice` - where customer=%s and docstatus = 1""", self.name) - - info = {} - info["billing_this_year"] = billing_this_year[0][0] if billing_this_year else 0 - info["currency"] = billing_this_year[0][1] if billing_this_year else get_default_currency() - info["total_unpaid"] = total_unpaid[0][0] if total_unpaid else 0 - + info = get_dashboard_info(self.doctype, self.name) self.set_onload('dashboard_info', info) - def autoname(self): cust_master_name = frappe.defaults.get_global_default('cust_master_name') if cust_master_name == 'Customer Name': From 24f0b13b229f13a5318508249dd66ecd4a92da39 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 13:01:26 +0530 Subject: [PATCH 03/28] Total unpaid amount in party is based on GLE --- erpnext/accounts/party.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index d54b5b9e85c..0501d3870bf 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -382,14 +382,17 @@ def get_dashboard_info(party_type, party): where {2}=%s and docstatus=1 and posting_date between %s and %s """.format(total_field, doctype, party_type.lower()), (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date)) - - total_unpaid = frappe.db.sql("""select sum(outstanding_amount) - from `tab{0}` - where {1}=%s and docstatus = 1""".format(doctype, party_type.lower()), party) + + total_unpaid = frappe.db.sql(""" + select sum(debit_in_account_currency) - sum(credit_in_account_currency) + from `tabGL Entry` + where party_type = %s and party=%s""", (party_type, party)) info = {} info["billing_this_year"] = billing_this_year[0][0] if billing_this_year else 0 info["currency"] = party_account_currency info["total_unpaid"] = total_unpaid[0][0] if total_unpaid else 0 + if party_type == "Supplier": + info["total_unpaid"] = -1 * info["total_unpaid"] return info \ No newline at end of file From 799a9cabe793838d4282dec58e11c627c520e044 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 23 May 2017 16:36:33 +0530 Subject: [PATCH 04/28] Can't change valuation method in stock settings, if there are transactions against some items which does not have it's own valuation method --- .../doctype/stock_settings/stock_settings.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py index 68d64a24740..d9d9568e40c 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.py +++ b/erpnext/stock/doctype/stock_settings/stock_settings.py @@ -26,3 +26,19 @@ class StockSettings(Document): # show/hide barcode field frappe.make_property_setter({'fieldname': 'barcode', 'property': 'hidden', 'value': 0 if self.show_barcode_field else 1}) + + self.cant_change_valuation_method() + + def cant_change_valuation_method(self): + db_valuation_method = frappe.db.get_single_value("Stock Settings", "valuation_method") + + if db_valuation_method and db_valuation_method != self.valuation_method: + # check if there are any stock ledger entries against items + # which does not have it's own valuation method + sle = frappe.db.sql("""select name from `tabStock Ledger Entry` sle + where exists(select name from tabItem + where name=sle.item_code and (valuation_method is null or valuation_method='')) + """) + + if sle: + frappe.throw(_("Can't change valuation method, as there are transactions against some items which does not have it's own valuation method")) \ No newline at end of file From 258f7da778a695f7bb11544db2af577248f54e41 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 23 May 2017 15:36:03 +0530 Subject: [PATCH 05/28] Paid amount + Write Off Amount can not be greater than Grand Total in return POS --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 8 ++++---- erpnext/patches/v7_2/update_assessment_modules.py | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 6e3990ac8d2..4b1837d4d73 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -411,10 +411,10 @@ class SalesInvoice(SellingController): throw(_("Customer {0} does not belong to project {1}").format(self.customer,self.project)) def validate_pos(self): - if flt(self.paid_amount) + flt(self.write_off_amount) \ - - flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)) and self.is_return: - frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total""")) - + if self.is_return: + if flt(self.paid_amount) + flt(self.write_off_amount) - flt(self.grand_total) < \ + 1/(10**(self.precision("grand_total") + 1)): + frappe.throw(_("Paid amount + Write Off Amount can not be greater than Grand Total")) def validate_item_code(self): for d in self.get('items'): diff --git a/erpnext/patches/v7_2/update_assessment_modules.py b/erpnext/patches/v7_2/update_assessment_modules.py index 9c00902f862..ec8577040e3 100644 --- a/erpnext/patches/v7_2/update_assessment_modules.py +++ b/erpnext/patches/v7_2/update_assessment_modules.py @@ -7,13 +7,15 @@ def execute(): frappe.rename_doc("DocType", "Grade Interval", "Grading Scale Interval", force=True) frappe.reload_doc("schools", "doctype", "grading_scale_interval") - rename_field("Grading Scale Interval", "to_score", "threshold") + if "to_score" in frappe.db.get_table_columns("Grading Scale Interval"): + rename_field("Grading Scale Interval", "to_score", "threshold") frappe.rename_doc("DocType", "Assessment", "Assessment Plan", force=True) #Rename Assessment Results frappe.reload_doc("schools", "doctype", "assessment_plan") - rename_field("Assessment Plan", "grading_structure", "grading_scale") + if "grading_structure" in frappe.db.get_table_columns("Assessment Plan"): + rename_field("Assessment Plan", "grading_structure", "grading_scale") frappe.reload_doc("schools", "doctype", "assessment_result") frappe.reload_doc("schools", "doctype", "assessment_result_detail") From 2f0c34385b6d78af8e39ea48f1994a94e4ab067e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 23 May 2017 21:51:32 +0530 Subject: [PATCH 06/28] Check if doctype exists before renaming --- .../patches/v7_2/update_assessment_modules.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/erpnext/patches/v7_2/update_assessment_modules.py b/erpnext/patches/v7_2/update_assessment_modules.py index ec8577040e3..9075bbf87db 100644 --- a/erpnext/patches/v7_2/update_assessment_modules.py +++ b/erpnext/patches/v7_2/update_assessment_modules.py @@ -3,14 +3,17 @@ from frappe.model.utils.rename_field import rename_field def execute(): #Rename Grading Structure to Grading Scale - frappe.rename_doc("DocType", "Grading Structure", "Grading Scale", force=True) - frappe.rename_doc("DocType", "Grade Interval", "Grading Scale Interval", force=True) + if not frappe.db.exists("DocType", "Grading Scale"): + frappe.rename_doc("DocType", "Grading Structure", "Grading Scale", force=True) + if not frappe.db.exists("DocType", "Grading Scale Interval"): + frappe.rename_doc("DocType", "Grade Interval", "Grading Scale Interval", force=True) frappe.reload_doc("schools", "doctype", "grading_scale_interval") if "to_score" in frappe.db.get_table_columns("Grading Scale Interval"): rename_field("Grading Scale Interval", "to_score", "threshold") - frappe.rename_doc("DocType", "Assessment", "Assessment Plan", force=True) + if not frappe.db.exists("DocType", "Assessment Plan"): + frappe.rename_doc("DocType", "Assessment", "Assessment Plan", force=True) #Rename Assessment Results frappe.reload_doc("schools", "doctype", "assessment_plan") @@ -22,9 +25,10 @@ def execute(): frappe.reload_doc("schools", "doctype", "assessment_criteria") - for assessment in frappe.get_all("Assessment Plan", fields=["name", "grading_scale"], filters = [["docstatus", "!=", 2 ]]): - print assessment - for stud_result in frappe.db.sql("select * from `tabAssessment Result` where parent= %s", assessment.name, as_dict=True): + for assessment in frappe.get_all("Assessment Plan", + fields=["name", "grading_scale"], filters = [["docstatus", "!=", 2 ]]): + for stud_result in frappe.db.sql("select * from `tabAssessment Result` where parent= %s", + assessment.name, as_dict=True): if stud_result.result: assessment_result = frappe.new_doc("Assessment Result") assessment_result.student = stud_result.student From baa4afd67bb53e67623cad29737fbfe1e0a63727 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Wed, 24 May 2017 13:07:16 +0530 Subject: [PATCH 07/28] [minor] removed the Grade Interval and Grading Structure doctype --- .../doctype/grade_interval/__init__.py | 0 .../grade_interval/grade_interval.json | 122 ----------- .../doctype/grade_interval/grade_interval.py | 11 - .../doctype/grading_structure/__init__.py | 0 .../grading_structure/grading_structure.js | 8 - .../grading_structure/grading_structure.json | 202 ------------------ .../grading_structure/grading_structure.py | 25 --- .../test_grading_structure.py | 12 -- 8 files changed, 380 deletions(-) delete mode 100644 erpnext/schools/doctype/grade_interval/__init__.py delete mode 100644 erpnext/schools/doctype/grade_interval/grade_interval.json delete mode 100644 erpnext/schools/doctype/grade_interval/grade_interval.py delete mode 100644 erpnext/schools/doctype/grading_structure/__init__.py delete mode 100644 erpnext/schools/doctype/grading_structure/grading_structure.js delete mode 100644 erpnext/schools/doctype/grading_structure/grading_structure.json delete mode 100644 erpnext/schools/doctype/grading_structure/grading_structure.py delete mode 100644 erpnext/schools/doctype/grading_structure/test_grading_structure.py diff --git a/erpnext/schools/doctype/grade_interval/__init__.py b/erpnext/schools/doctype/grade_interval/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/schools/doctype/grade_interval/grade_interval.json b/erpnext/schools/doctype/grade_interval/grade_interval.json deleted file mode 100644 index c9c59495d9e..00000000000 --- a/erpnext/schools/doctype/grade_interval/grade_interval.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "allow_copy": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2016-08-26 03:11:09.591049", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "grade_code", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grade Code", - "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": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "min_score", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Min Score", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "1", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "grade_description", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grade Description", - "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 - } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2016-12-14 12:54:56.902465", - "modified_by": "Administrator", - "module": "Schools", - "name": "Grade Interval", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/schools/doctype/grade_interval/grade_interval.py b/erpnext/schools/doctype/grade_interval/grade_interval.py deleted file mode 100644 index c8ded136ecc..00000000000 --- a/erpnext/schools/doctype/grade_interval/grade_interval.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document - -class GradeInterval(Document): - def validate(self): - pass \ No newline at end of file diff --git a/erpnext/schools/doctype/grading_structure/__init__.py b/erpnext/schools/doctype/grading_structure/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/schools/doctype/grading_structure/grading_structure.js b/erpnext/schools/doctype/grading_structure/grading_structure.js deleted file mode 100644 index 36f45042c0c..00000000000 --- a/erpnext/schools/doctype/grading_structure/grading_structure.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Grading Structure', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/schools/doctype/grading_structure/grading_structure.json b/erpnext/schools/doctype/grading_structure/grading_structure.json deleted file mode 100644 index 3c30f299d2f..00000000000 --- a/erpnext/schools/doctype/grading_structure/grading_structure.json +++ /dev/null @@ -1,202 +0,0 @@ -{ - "allow_copy": 0, - "allow_import": 0, - "allow_rename": 1, - "autoname": "field:grading_system_name", - "beta": 0, - "creation": "2016-08-26 03:06:53.922972", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "grading_system_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grading System Name", - "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": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 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_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_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "description", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Description", - "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_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "grading_intervals_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Grading Intervals", - "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_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "grade_intervals", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Grade Intervals", - "length": 0, - "no_copy": 0, - "options": "Grade Interval", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2016-12-14 12:35:39.690256", - "modified_by": "Administrator", - "module": "Schools", - "name": "Grading Structure", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "is_custom": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Academics User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "grading_system_name", - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/schools/doctype/grading_structure/grading_structure.py b/erpnext/schools/doctype/grading_structure/grading_structure.py deleted file mode 100644 index 1b5d6a8d2ed..00000000000 --- a/erpnext/schools/doctype/grading_structure/grading_structure.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -import frappe -from frappe.model.document import Document -from frappe import _ -from frappe.utils import cstr - -class GradingStructure(Document): - def validate(self): - grade_intervals = self.get("grade_intervals") - check_overlap(grade_intervals, self) - -#Check if any of the grade intervals for this grading structure overlap -def check_overlap(grade_intervals, parent_doc): - for interval1 in grade_intervals: - for interval2 in grade_intervals: - if interval1.name == interval2.name: - pass - else: - if (interval1.from_score <= interval2.from_score and interval1.to_score >= interval2.from_score) or (interval1.from_score <= interval2.to_score and interval1.to_score >= interval2.to_score): - frappe.throw(_("""The intervals for Grade Code {0} overlaps with the grade intervals for other grades. - Please check intervals {0} and {1} and try again""".format(interval1.grade_code, interval2.grade_code))) \ No newline at end of file diff --git a/erpnext/schools/doctype/grading_structure/test_grading_structure.py b/erpnext/schools/doctype/grading_structure/test_grading_structure.py deleted file mode 100644 index 0e360806788..00000000000 --- a/erpnext/schools/doctype/grading_structure/test_grading_structure.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -# test_records = frappe.get_test_records('Grading Structure') - -class TestGradingStructure(unittest.TestCase): - pass From d1552f97e47dc4a629df6f94bec997c636c4e98a Mon Sep 17 00:00:00 2001 From: mbauskar Date: Wed, 24 May 2017 13:17:56 +0530 Subject: [PATCH 08/28] [minor] moved a comment in item.js --- erpnext/stock/doctype/item/item.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 057c78a81f1..86c69594488 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -44,8 +44,6 @@ frappe.ui.form.on("Item", { }, __("View")); } - // make sensitive fields(has_serial_no, is_stock_item, valuation_method) - // read only if any stock ledger entry exists if(!frm.doc.is_fixed_asset) { erpnext.item.make_dashboard(frm); } @@ -77,6 +75,8 @@ frappe.ui.form.on("Item", { erpnext.item.edit_prices_button(frm); + // make sensitive fields(has_serial_no, is_stock_item, valuation_method, has_batch_no) + // read only if any stock ledger entry exists if (!frm.doc.__islocal && frm.doc.is_stock_item) { frm.toggle_enable(['has_serial_no', 'is_stock_item', 'valuation_method', 'has_batch_no'], (frm.doc.__onload && frm.doc.__onload.sle_exists=="exists") ? false : true); From ff70f38eace6f24f87661fab20dfb57f53e95d51 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Wed, 24 May 2017 16:55:24 +0530 Subject: [PATCH 09/28] [minor] patch to delete the schools deprecated doctypes --- erpnext/patches.txt | 1 + .../v8_0/delete_schools_depricated_doctypes.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 erpnext/patches/v8_0/delete_schools_depricated_doctypes.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index ac91f6038b7..853efa1cc30 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -396,3 +396,4 @@ erpnext.patches.v8_0.merge_student_batch_and_student_group erpnext.patches.v8_0.rename_total_margin_to_rate_with_margin # 11-05-2017 erpnext.patches.v8_0.fix_status_for_invoices_with_negative_outstanding erpnext.patches.v8_0.make_payments_table_blank_for_non_pos_invoice +erpnext.patches.v8_0.delete_schools_depricated_doctypes diff --git a/erpnext/patches/v8_0/delete_schools_depricated_doctypes.py b/erpnext/patches/v8_0/delete_schools_depricated_doctypes.py new file mode 100644 index 00000000000..09a78ed3ca6 --- /dev/null +++ b/erpnext/patches/v8_0/delete_schools_depricated_doctypes.py @@ -0,0 +1,14 @@ +# Copyright (c) 2017, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + """ delete doctypes """ + + if frappe.db.exists("DocType", "Grading Structure"): + frappe.delete_doc("DocType", "Grading Structure", force=1) + + if frappe.db.exists("DocType", "Grade Interval"): + frappe.delete_doc("DocType", "Grade Interval", force=1) \ No newline at end of file From 331566d61229a0698b7d2daf319e51cbc74fd7e9 Mon Sep 17 00:00:00 2001 From: KanchanChauhan Date: Fri, 19 May 2017 15:14:31 +0530 Subject: [PATCH 10/28] Website Specification Labls should not be capitalised by default (#8798) --- erpnext/templates/generators/item.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/templates/generators/item.html b/erpnext/templates/generators/item.html index c0399a787a8..de544930cc3 100644 --- a/erpnext/templates/generators/item.html +++ b/erpnext/templates/generators/item.html @@ -87,7 +87,7 @@ {% for d in website_specifications -%} - + {%- endfor %} From 9283377f87b891563b844620a2fe4f9823e7e3f1 Mon Sep 17 00:00:00 2001 From: Abdulla P I Date: Fri, 19 May 2017 15:15:36 +0530 Subject: [PATCH 11/28] Update lead.py (#8789) * Update lead.py Import datetime to compare next contact date with now() * Update lead.py * Update lead.py As per the suggestion from Nabin,instead of Datetime,getdate and nowdate from frappe.utils imported --- erpnext/crm/doctype/lead/lead.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index ccbb5369aab..aafc128e919 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 @@ -46,7 +46,7 @@ class Lead(SellingController): if self.is_new() or not self.image: 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): From c320537e4ca682c6139fd5cb40fa0cf61a0cd2bb Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Fri, 19 May 2017 15:16:50 +0530 Subject: [PATCH 12/28] link the different doctype in the school module (#8844) --- erpnext/schools/doctype/course/course.js | 12 ++++++++++++ erpnext/schools/doctype/program/program.js | 15 +++++++++++++++ .../student_attendance_tool.js | 6 ++++++ .../doctype/student_group/student_group.js | 17 ++++++++++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/erpnext/schools/doctype/course/course.js b/erpnext/schools/doctype/course/course.js index f84c59fcd25..c667eca2b7b 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 cc09d0ef4d3..5146a193221 100644 --- a/erpnext/schools/doctype/program/program.js +++ b/erpnext/schools/doctype/program/program.js @@ -6,22 +6,37 @@ cur_frm.add_fetch('fee_structure', 'total_amount', 'amount'); 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 6f8c6cd7da1..11a79e134e3 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.provide("schools") 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 ed9469015b3..83fe0945cc3 100644 --- a/erpnext/schools/doctype/student_group/student_group.js +++ b/erpnext/schools/doctype/student_group/student_group.js @@ -13,11 +13,23 @@ frappe.ui.form.on("Student Group", { 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 @@ frappe.ui.form.on("Student Group", { }); }); frm.add_custom_button(__("Newsletter"), function() { + frappe.route_options = { + "Newsletter Email Group.email_group": frm.doc.name + } frappe.set_route("List", "Newsletter"); }); } From ce9ac7885e15f9ed511b29e70f579a46ffb2799f Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Fri, 19 May 2017 12:32:30 +0200 Subject: [PATCH 13/28] Prompt for mandatory batch number in POS (#8928) * Prompt for mandatory batch number in POS * Whitespaces correction --- erpnext/accounts/page/pos/pos.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index 9261fa4f396..6a2e0cfe4bc 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -398,7 +398,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ this.make_item_list(); this.make_discount_field() }, - + make_control: function() { this.frm = {} this.frm.doc = this.doc @@ -543,7 +543,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ me.toggle_totals_area(); }); }, - + bind_numeric_keypad: function() { var me = this; $(this.numeric_keypad).find('.pos-operation').on('click', function(){ @@ -572,7 +572,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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); @@ -580,7 +580,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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); @@ -988,7 +988,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ })).tooltip().appendTo($wrap); } }); - + $wrap.append(`
@@ -1070,7 +1070,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ }); } }, - + bind_items_event: function() { var me = this; $(this.wrapper).on('click', '.pos-bill-item', function() { @@ -1107,7 +1107,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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(); @@ -1763,10 +1763,14 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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 () { @@ -1788,7 +1792,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ item.pricing_rule = null; me.apply_pricing_rule_on_item(item) } - + if(item.discount_percentage > 0) { me.apply_pricing_rule_on_item(item) } From 818ad397c85eb37266133d194be89ec2cf8164f3 Mon Sep 17 00:00:00 2001 From: Gaurav Naik Date: Fri, 19 May 2017 16:03:05 +0530 Subject: [PATCH 14/28] Documentation for Allow Login using Mobile Number (#8918) --- .../assets/img/setup/users/user-login-email.png | Bin 0 -> 13676 bytes .../img/setup/users/user-login-mobile.png | Bin 0 -> 12278 bytes .../en/setting-up/settings/system-settings.md | 2 ++ .../users-and-permissions/adding-users.md | 5 ++++- 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 erpnext/docs/assets/img/setup/users/user-login-email.png create mode 100644 erpnext/docs/assets/img/setup/users/user-login-mobile.png 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 0000000000000000000000000000000000000000..71050af56855ab3f81ab0aaa4d40552721853ed5 GIT binary patch literal 13676 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 R|0xBKl~j_b5i<$-{{W9T?`Z%4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1d7af14305298b31c2ba63b76ca82fe0211cd629 GIT binary patch literal 12278 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

qQ`j;{jbJXQvS?tMLW0V zi^7%jAwSNM0pnBNrjj$)Ot+A;F~2Ts`0u-Tw_oB@B8`_tty0`nAyl-eA!}2&4nGU7 z*H6moUbg^C%0XJQdNxibSx+J zStKB+M9_HJvEO$end|dIgUgkSU!HJJqi4JVKP9}sXy*^f;7?}n@I4r~)h9=wz`=>l zGD|W&S1C1f%b9NObf{kp?rvW!mMnQPWPA@fUOU-t)gUdo|4MS8wejMk1V4GQuA(yY zYN;vZa6H&=IlHT37lTQBiH?`yZM8s53z;U1^V#y4dbAIlXxcX}ai|mRyC*U0r;a^+ z4zMuM&7_B6Mt!qn=Ow z${M7DKTSuzWu=GO64K6?hki3^-f2dH4`~ z7<+eZ-5)iK^Jr}aFI`OEP9G25ln9%v8k3s}14^82WlpXSAT9JE*;0>ZA(kd5S*X!w z0C0s2X5VjHIXfzGdSWC~vMwJM?#=M)ExALS000!w{f0qaoRN|j z?);o5P1s1T;RyrLBoB=VcV?CJivSDn2X6^cx%~*(kLE$A{|+{I4cOkMb-MeYV)ZXC za7wl9dC$Xj^D2vW6~2_sCSqJMp($RV0VmToBP=Yo(u<~;?SttunOc`#@D`VZ3q5rt z#aTl6-K<4t7&ToByJe!*vM~bHa^_C&|NO;S^_8e~(LGq34-9@RrCnf7oJQ8vXT?48 zk`j9F_VNX5KDDZ~iKBz`pM74zzd~z!TWb6cO+1$yL#q=4BVFG6&QpM|r|vPeo?tu` zENa1=G-1C`S`T_$qgi^Wb)6H@6s3^2nmWflrNCSo4L>FLF}jZozlHE~c~{D8k&Qoou<15{0^B zZO@gYYE~;qBb?f!2mmA*MUa!fw{{{w1Y*-Od-cxQ<<&B93$V3H>H~Iuh8_XU(Sb`R z(t_ea9^<}BmTTVBLw{Tp>7ytlcEpqD_Xg=8{_;EpQ)hLlRIe`fZeTMen^jxU;k=^I zYfOEYId@2Im{N_!Rjd9&)7?Rw=o<<;zpKHj`-`f_Drnx!{S>GR23nnm@h)Zjc?vE? z=N7DY89u>fxU8D}CBQWsz?#iXHmW@Bg=W4Kh7+*rK%t1XjjnV447TRH-JB?!+ILcSTLYoWPVX#S=!P9{OyzsMgr6Qlpnl{}Ts zlwh%DJ--1=#c^E|gi$(`eWv`CF)|Gk;VYWuxlmqS4s97AvEw#HT&T*D&oOjWB`IP6 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 517c6746e60..6fb64df37e5 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 @@ To add a new user, click on "New" 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. + +Email Login +Mobile No Login After adding these details, save the user. From 7e661437b1abb52b2a3595bb8bb52cb1a7b6249e Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Fri, 19 May 2017 12:34:10 +0200 Subject: [PATCH 15/28] View Attachments in portal (#8830) * View Attachments in portal * HTML beautify correction * Move option to shopping cart settings * new field in shopping cart settings for public attachments display in portal --- .../shopping_cart_settings.json | 75 ++++++++++++++++++- .../shopping_cart_settings.py | 4 + erpnext/templates/pages/order.html | 20 ++++- erpnext/templates/pages/order.py | 8 ++ 4 files changed, 105 insertions(+), 2 deletions(-) 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 c5efdf8578f..ed782ad1cf0 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 4e24d2e6eec..aa4f16360dd 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 @@ def check_shopping_cart_enabled(): 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/pages/order.html b/erpnext/templates/pages/order.html index 71291783b0d..da9eb33c89b 100644 --- a/erpnext/templates/pages/order.html +++ b/erpnext/templates/pages/order.html @@ -86,6 +86,24 @@ {% endif %} {% endif %}

+ +{% if attachments %} +
+
+
+ {{ _("Attachments") }} +
+
+
+
+ {% for attachment in attachments %} +

+ {{ attachment.file_name }} +

+ {% endfor %} +
+
+
+{% endif %}
- {% endblock %} diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py index 296b907282b..b453c7e3e70 100644 --- a/erpnext/templates/pages/order.py +++ b/erpnext/templates/pages/order.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals 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 @@ def get_context(context): 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 @@ def get_context(context): 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}) From bf4915b285be46cac921a21b738fda84ee8940b1 Mon Sep 17 00:00:00 2001 From: Ayush AS Date: Fri, 19 May 2017 17:35:30 +0530 Subject: [PATCH 16/28] Added flt to convert string to float --- erpnext/controllers/taxes_and_totals.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index c1c1fd7cda4..87c4719b08f 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -462,9 +462,9 @@ class calculate_taxes_and_totals(object): if self.doc.is_pos: for payment in self.doc.get('payments'): - payment.base_amount = flt(payment.amount * self.doc.conversion_rate) - paid_amount += payment.amount - base_paid_amount += payment.base_amount + payment.base_amount = flt(flt(payment.amount) * self.doc.conversion_rate) + paid_amount += flt(payment.amount) + base_paid_amount += flt(payment.base_amount) elif not self.doc.is_return: self.doc.set('payments', []) From e4afab7fb0a58a75bc650158cf3c595b7a89c72e Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 19 May 2017 18:59:16 +0530 Subject: [PATCH 17/28] Update taxes_and_totals.py --- erpnext/controllers/taxes_and_totals.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 87c4719b08f..822d50bfdf8 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -462,9 +462,10 @@ class calculate_taxes_and_totals(object): if self.doc.is_pos: for payment in self.doc.get('payments'): - payment.base_amount = flt(flt(payment.amount) * self.doc.conversion_rate) - paid_amount += flt(payment.amount) - base_paid_amount += flt(payment.base_amount) + payment.amount = flt(payment.amount) + payment.base_amount = payment.amount * flt(self.doc.conversion_rate) + paid_amount += payment.amount + base_paid_amount += payment.base_amount elif not self.doc.is_return: self.doc.set('payments', []) From 0cd792ebb215c6cbe72238fbc7595944728aa3ca Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 18/28] Revert "Update taxes_and_totals.py" This reverts commit e4afab7fb0a58a75bc650158cf3c595b7a89c72e. --- erpnext/controllers/taxes_and_totals.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 822d50bfdf8..87c4719b08f 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -462,10 +462,9 @@ class calculate_taxes_and_totals(object): if self.doc.is_pos: for payment in self.doc.get('payments'): - payment.amount = flt(payment.amount) - payment.base_amount = payment.amount * flt(self.doc.conversion_rate) - paid_amount += payment.amount - base_paid_amount += payment.base_amount + payment.base_amount = flt(flt(payment.amount) * self.doc.conversion_rate) + paid_amount += flt(payment.amount) + base_paid_amount += flt(payment.base_amount) elif not self.doc.is_return: self.doc.set('payments', []) From eb92d907bc2a549030c181db2e4e255e9a6f8f0a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 19/28] Revert "Added flt to convert string to float" This reverts commit bf4915b285be46cac921a21b738fda84ee8940b1. --- erpnext/controllers/taxes_and_totals.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 87c4719b08f..c1c1fd7cda4 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -462,9 +462,9 @@ class calculate_taxes_and_totals(object): if self.doc.is_pos: for payment in self.doc.get('payments'): - payment.base_amount = flt(flt(payment.amount) * self.doc.conversion_rate) - paid_amount += flt(payment.amount) - base_paid_amount += flt(payment.base_amount) + payment.base_amount = flt(payment.amount * self.doc.conversion_rate) + paid_amount += payment.amount + base_paid_amount += payment.base_amount elif not self.doc.is_return: self.doc.set('payments', []) From 689da20e7b87f980c9930d5ec21703f746d2c0d2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 20/28] Revert "View Attachments in portal (#8830)" This reverts commit 7e661437b1abb52b2a3595bb8bb52cb1a7b6249e. --- .../shopping_cart_settings.json | 75 +------------------ .../shopping_cart_settings.py | 4 - erpnext/templates/pages/order.html | 20 +---- erpnext/templates/pages/order.py | 8 -- 4 files changed, 2 insertions(+), 105 deletions(-) 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 ed782ad1cf0..c5efdf8578f 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,7 +13,6 @@ "editable_grid": 0, "fields": [ { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -42,67 +41,6 @@ "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, @@ -130,7 +68,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -160,7 +97,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -192,7 +128,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -222,7 +157,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -250,7 +184,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -281,7 +214,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -310,7 +242,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -341,7 +272,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -371,7 +301,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -404,7 +333,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -433,7 +361,6 @@ "unique": 0 }, { - "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -475,7 +402,7 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-05-19 09:31:38.078110", + "modified": "2017-03-21 15:42:08.574497", "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 aa4f16360dd..4e24d2e6eec 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,7 +89,3 @@ def check_shopping_cart_enabled(): 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/pages/order.html b/erpnext/templates/pages/order.html index da9eb33c89b..71291783b0d 100644 --- a/erpnext/templates/pages/order.html +++ b/erpnext/templates/pages/order.html @@ -86,24 +86,6 @@ {% endif %} {% endif %} - -{% if attachments %} -
-
-
- {{ _("Attachments") }} -
-
-
-
- {% for attachment in attachments %} -

- {{ attachment.file_name }} -

- {% endfor %} -
-
-
-{% endif %} + {% endblock %} diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py index b453c7e3e70..296b907282b 100644 --- a/erpnext/templates/pages/order.py +++ b/erpnext/templates/pages/order.py @@ -5,7 +5,6 @@ from __future__ import unicode_literals 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 @@ -14,9 +13,6 @@ def get_context(context): 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") @@ -25,7 +21,3 @@ def get_context(context): 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}) From 54fcf85317e2a7d0c64925cf1ae1faef06c4fd60 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 21/28] Revert "Documentation for Allow Login using Mobile Number (#8918)" This reverts commit 818ad397c85eb37266133d194be89ec2cf8164f3. --- .../assets/img/setup/users/user-login-email.png | Bin 13676 -> 0 bytes .../img/setup/users/user-login-mobile.png | Bin 12278 -> 0 bytes .../en/setting-up/settings/system-settings.md | 2 -- .../users-and-permissions/adding-users.md | 5 +---- 4 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 erpnext/docs/assets/img/setup/users/user-login-email.png delete mode 100644 erpnext/docs/assets/img/setup/users/user-login-mobile.png diff --git a/erpnext/docs/assets/img/setup/users/user-login-email.png b/erpnext/docs/assets/img/setup/users/user-login-email.png deleted file mode 100644 index 71050af56855ab3f81ab0aaa4d40552721853ed5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13676 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 R|0xBKl~j_b5i<$-{{W9T?`Z%4 diff --git a/erpnext/docs/assets/img/setup/users/user-login-mobile.png b/erpnext/docs/assets/img/setup/users/user-login-mobile.png deleted file mode 100644 index 1d7af14305298b31c2ba63b76ca82fe0211cd629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12278 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

qQ`j;{jbJXQvS?tMLW0V zi^7%jAwSNM0pnBNrjj$)Ot+A;F~2Ts`0u-Tw_oB@B8`_tty0`nAyl-eA!}2&4nGU7 z*H6moUbg^C%0XJQdNxibSx+J zStKB+M9_HJvEO$end|dIgUgkSU!HJJqi4JVKP9}sXy*^f;7?}n@I4r~)h9=wz`=>l zGD|W&S1C1f%b9NObf{kp?rvW!mMnQPWPA@fUOU-t)gUdo|4MS8wejMk1V4GQuA(yY zYN;vZa6H&=IlHT37lTQBiH?`yZM8s53z;U1^V#y4dbAIlXxcX}ai|mRyC*U0r;a^+ z4zMuM&7_B6Mt!qn=Ow z${M7DKTSuzWu=GO64K6?hki3^-f2dH4`~ z7<+eZ-5)iK^Jr}aFI`OEP9G25ln9%v8k3s}14^82WlpXSAT9JE*;0>ZA(kd5S*X!w z0C0s2X5VjHIXfzGdSWC~vMwJM?#=M)ExALS000!w{f0qaoRN|j z?);o5P1s1T;RyrLBoB=VcV?CJivSDn2X6^cx%~*(kLE$A{|+{I4cOkMb-MeYV)ZXC za7wl9dC$Xj^D2vW6~2_sCSqJMp($RV0VmToBP=Yo(u<~;?SttunOc`#@D`VZ3q5rt z#aTl6-K<4t7&ToByJe!*vM~bHa^_C&|NO;S^_8e~(LGq34-9@RrCnf7oJQ8vXT?48 zk`j9F_VNX5KDDZ~iKBz`pM74zzd~z!TWb6cO+1$yL#q=4BVFG6&QpM|r|vPeo?tu` zENa1=G-1C`S`T_$qgi^Wb)6H@6s3^2nmWflrNCSo4L>FLF}jZozlHE~c~{D8k&Qoou<15{0^B zZO@gYYE~;qBb?f!2mmA*MUa!fw{{{w1Y*-Od-cxQ<<&B93$V3H>H~Iuh8_XU(Sb`R z(t_ea9^<}BmTTVBLw{Tp>7ytlcEpqD_Xg=8{_;EpQ)hLlRIe`fZeTMen^jxU;k=^I zYfOEYId@2Im{N_!Rjd9&)7?Rw=o<<;zpKHj`-`f_Drnx!{S>GR23nnm@h)Zjc?vE? z=N7DY89u>fxU8D}CBQWsz?#iXHmW@Bg=W4Kh7+*rK%t1XjjnV447TRH-JB?!+ILcSTLYoWPVX#S=!P9{OyzsMgr6Qlpnl{}Ts zlwh%DJ--1=#c^E|gi$(`eWv`CF)|Gk;VYWuxlmqS4s97AvEw#HT&T*D&oOjWB`IP6 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 6fb64df37e5..517c6746e60 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,10 +20,7 @@ To add a new user, click on "New" Add user details such as First Name, Last Name, Email etc. -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. - -Email Login -Mobile No Login +The user's Email will become the user id. After adding these details, save the user. From b3d4326dcc314590bc776b9a2b4931011e8f5265 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 22/28] Revert "Prompt for mandatory batch number in POS (#8928)" This reverts commit ce9ac7885e15f9ed511b29e70f579a46ffb2799f. --- erpnext/accounts/page/pos/pos.js | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index 6a2e0cfe4bc..9261fa4f396 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -398,7 +398,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ this.make_item_list(); this.make_discount_field() }, - + make_control: function() { this.frm = {} this.frm.doc = this.doc @@ -543,7 +543,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ me.toggle_totals_area(); }); }, - + bind_numeric_keypad: function() { var me = this; $(this.numeric_keypad).find('.pos-operation').on('click', function(){ @@ -572,7 +572,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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); @@ -580,7 +580,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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); @@ -988,7 +988,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ })).tooltip().appendTo($wrap); } }); - + $wrap.append(`

@@ -1070,7 +1070,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ }); } }, - + bind_items_event: function() { var me = this; $(this.wrapper).on('click', '.pos-bill-item', function() { @@ -1107,7 +1107,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ 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(); @@ -1763,14 +1763,10 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ mandatory_batch_no: function () { var me = this; if (this.items[0].has_batch_no && !this.item_batch_no[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')) - } + frappe.throw(__(repl("Error: Batch no is mandatory for item %(item)s", { + 'item': this.items[0].item_code + }))) + } }, apply_pricing_rule: function () { @@ -1792,7 +1788,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ item.pricing_rule = null; me.apply_pricing_rule_on_item(item) } - + if(item.discount_percentage > 0) { me.apply_pricing_rule_on_item(item) } From fdce7a0dc3f0bc96d3f891ce3eb0fdcfedd348b1 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 23/28] Revert "link the different doctype in the school module (#8844)" This reverts commit c320537e4ca682c6139fd5cb40fa0cf61a0cd2bb. --- erpnext/schools/doctype/course/course.js | 12 ------------ erpnext/schools/doctype/program/program.js | 15 --------------- .../student_attendance_tool.js | 6 ------ .../doctype/student_group/student_group.js | 17 +---------------- 4 files changed, 1 insertion(+), 49 deletions(-) diff --git a/erpnext/schools/doctype/course/course.js b/erpnext/schools/doctype/course/course.js index c667eca2b7b..f84c59fcd25 100644 --- a/erpnext/schools/doctype/course/course.js +++ b/erpnext/schools/doctype/course/course.js @@ -1,30 +1,18 @@ 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 5146a193221..cc09d0ef4d3 100644 --- a/erpnext/schools/doctype/program/program.js +++ b/erpnext/schools/doctype/program/program.js @@ -6,37 +6,22 @@ cur_frm.add_fetch('fee_structure', 'total_amount', 'amount'); 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 11a79e134e3..6f8c6cd7da1 100644 --- a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js +++ b/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js @@ -4,12 +4,6 @@ frappe.provide("schools") 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 83fe0945cc3..ed9469015b3 100644 --- a/erpnext/schools/doctype/student_group/student_group.js +++ b/erpnext/schools/doctype/student_group/student_group.js @@ -13,23 +13,11 @@ frappe.ui.form.on("Student Group", { 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() { @@ -42,9 +30,6 @@ frappe.ui.form.on("Student Group", { }); }); frm.add_custom_button(__("Newsletter"), function() { - frappe.route_options = { - "Newsletter Email Group.email_group": frm.doc.name - } frappe.set_route("List", "Newsletter"); }); } From 79165905288a11f09fbef8659f5d6e7f9a472ad3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 24/28] Revert "Update lead.py (#8789)" This reverts commit 9283377f87b891563b844620a2fe4f9823e7e3f1. --- erpnext/crm/doctype/lead/lead.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index aafc128e919..ccbb5369aab 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, getdate, nowdate) +from frappe.utils import (cstr, validate_email_add, cint, comma_and, has_gravatar, now) from frappe.model.mapper import get_mapped_doc from erpnext.controllers.selling_controller import SellingController @@ -46,7 +46,7 @@ class Lead(SellingController): if self.is_new() or not self.image: self.image = has_gravatar(self.email_id) - if self.contact_date and getdate(self.contact_date) < getdate(nowdate()): + if self.contact_date and self.contact_date < now(): frappe.throw(_("Next Contact Date cannot be in the past")) def on_update(self): From adfe84b04ff8518db69e7d51b0e2354e4260a61a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 17:31:58 +0530 Subject: [PATCH 25/28] Revert "Website Specification Labls should not be capitalised by default (#8798)" This reverts commit 331566d61229a0698b7d2daf319e51cbc74fd7e9. --- erpnext/templates/generators/item.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/templates/generators/item.html b/erpnext/templates/generators/item.html index de544930cc3..c0399a787a8 100644 --- a/erpnext/templates/generators/item.html +++ b/erpnext/templates/generators/item.html @@ -87,7 +87,7 @@
{{ d.label }}{{ d.label }} {{ d.description }}
{% for d in website_specifications -%} - + {%- endfor %} From d0ebd7f7c2f11cc086ce7c26a36a588a6783ce41 Mon Sep 17 00:00:00 2001 From: CH Date: Wed, 24 May 2017 13:49:53 +0200 Subject: [PATCH 26/28] POS translatable fields correction --- erpnext/public/js/pos/pos.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/public/js/pos/pos.html b/erpnext/public/js/pos/pos.html index 181a41f2d5e..6065e603c79 100644 --- a/erpnext/public/js/pos/pos.html +++ b/erpnext/public/js/pos/pos.html @@ -68,12 +68,12 @@ - \ No newline at end of file + From 659a225f24691ac09127a8dbc54afc640948a8ad Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Wed, 24 May 2017 17:49:52 +0530 Subject: [PATCH 27/28] allow multiple items in purchase receipt (#8997) --- erpnext/stock/doctype/purchase_receipt/purchase_receipt.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 055b9c47f92..c11965e2560 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -74,7 +74,8 @@ class PurchaseReceipt(BuyingController): "Purchase Order Item": { "ref_dn_field": "purchase_order_item", "compare_fields": [["project", "="], ["uom", "="], ["item_code", "="]], - "is_child_table": True + "is_child_table": True, + "allow_duplicate_prev_row_id": True } }) From 12ec71781db227f9356454fa78f0f00e32a7e78f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 May 2017 19:08:33 +0600 Subject: [PATCH 28/28] bumped to version 8.0.38 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 076baeaac7c..235b1b0a01e 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '8.0.37' +__version__ = '8.0.38' def get_default_company(user=None):
{{ d.label }}{{ d.label }} {{ d.description }}