From d13985d1d0bf84879c0c7eff4b87749e7942f4b4 Mon Sep 17 00:00:00 2001 From: britlog Date: Fri, 19 Jan 2018 18:31:25 +0100 Subject: [PATCH 01/20] Add number spinner for quantity --- erpnext/templates/generators/item.html | 15 ++++++++++++++ erpnext/templates/includes/product_page.js | 24 ++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/erpnext/templates/generators/item.html b/erpnext/templates/generators/item.html index de544930cc..6fec94e99c 100644 --- a/erpnext/templates/generators/item.html +++ b/erpnext/templates/generators/item.html @@ -57,6 +57,21 @@
+
+ +
+ + + + + + + +
+
+
diff --git a/erpnext/templates/includes/product_page.js b/erpnext/templates/includes/product_page.js index 9f9d6ac412..722283e6cb 100644 --- a/erpnext/templates/includes/product_page.js +++ b/erpnext/templates/includes/product_page.js @@ -15,7 +15,7 @@ frappe.ready(function() { $(".item-cart").toggleClass("hide", (!!!r.message.price || !!!r.message.in_stock)); if(r.message && r.message.price) { $(".item-price") - .html(r.message.price.formatted_price + " {{ _("per") }} " + r.message.uom); + .html(r.message.price.formatted_price + " / " + r.message.uom); if(r.message.in_stock==0) { $(".item-stock").html("
{{ _("Not in stock") }}
"); @@ -44,7 +44,7 @@ frappe.ready(function() { erpnext.shopping_cart.update_cart({ item_code: get_item_code(), - qty: 1, + qty: $("#item-spinner .cart-qty").val(), callback: function(r) { if(!r.exc) { toggle_update_cart(1); @@ -55,6 +55,25 @@ frappe.ready(function() { }); }); + $("#item-spinner").on('click', '.number-spinner button', function () { + var btn = $(this), + input = btn.closest('.number-spinner').find('input'), + oldValue = input.val().trim(), + newVal = 0; + + if (btn.attr('data-dir') == 'up') { + newVal = parseInt(oldValue) + 1; + } else if (btn.attr('data-dir') == 'dwn') { + if (parseInt(oldValue) > 1) { + newVal = parseInt(oldValue) - 1; + } + else { + newVal = parseInt(oldValue); + } + } + input.val(newVal); + }); + $("[itemscope] .item-view-attribute .form-control").on("change", function() { try { var item_code = encodeURIComponent(get_item_code()); @@ -86,6 +105,7 @@ var toggle_update_cart = function(qty) { $("#item-update-cart") .toggle(qty ? true : false) .find("input").val(qty); + $("#item-spinner").toggle(qty ? false : true); } function get_item_code() { From ce5b93ca771aa84c52828ec63889b503bf1cb905 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Tue, 30 Jan 2018 10:39:46 +0530 Subject: [PATCH 02/20] [Fix] Allow user to edit rate in online POS (#12701) --- .../accounts/doctype/sales_invoice/sales_invoice.py | 5 ++++- erpnext/selling/page/point_of_sale/point_of_sale.js | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index b6c84052a6..df1284cf39 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -242,7 +242,10 @@ class SalesInvoice(SellingController): super(SalesInvoice, self).set_missing_values(for_validate) if pos: - return {"print_format": pos.get("print_format_for_online") } + return { + "print_format": pos.get("print_format_for_online"), + "allow_edit_rate": pos.get("allow_user_to_edit_rate") + } def update_time_sheet(self, sales_invoice): for d in self.timesheets: diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.js b/erpnext/selling/page/point_of_sale/point_of_sale.js index 0876228d42..f5bc6c2499 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.js +++ b/erpnext/selling/page/point_of_sale/point_of_sale.js @@ -463,6 +463,7 @@ erpnext.pos.PointOfSale = class PointOfSale { if (r.message) { this.frm.meta.default_print_format = r.message.print_format || 'POS Invoice'; + this.frm.allow_edit_rate = r.message.allow_edit_rate; } } @@ -727,6 +728,7 @@ class POSCart { disable_highlight: ['Qty', 'Disc', 'Rate', 'Pay'], reset_btns: ['Qty', 'Disc', 'Rate', 'Pay'], del_btn: 'Del', + disable_btns: !this.frm.allow_edit_rate ? ['Rate']: [], wrapper: this.wrapper.find('.number-pad-container'), onclick: (btn_value) => { // on click @@ -1257,7 +1259,7 @@ class NumberPad { constructor({ wrapper, onclick, button_array, add_class={}, disable_highlight=[], - reset_btns=[], del_btn='', + reset_btns=[], del_btn='', disable_btns }) { this.wrapper = wrapper; this.onclick = onclick; @@ -1266,6 +1268,7 @@ class NumberPad { this.disable_highlight = disable_highlight; this.reset_btns = reset_btns; this.del_btn = del_btn; + this.disable_btns = disable_btns; this.make_dom(); this.bind_events(); this.value = ''; @@ -1296,6 +1299,14 @@ class NumberPad { } this.set_class(); + + this.disable_btns.forEach((btn) => { + const $btn = this.get_btn(btn); + $btn.prop("disabled", true) + $btn.hover(() => { + $btn.css('cursor','not-allowed'); + }) + }) } set_class() { From 585254456e43f8512faa13c852b58ce9ec188eb2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 12:11:22 +0530 Subject: [PATCH 03/20] Check credit limit while making DN, if bypassed on SO (#12702) --- .../doctype/sales_invoice/sales_invoice.py | 7 ++- .../selling/doctype/customer/customer.json | 49 +++++++++++++++---- erpnext/selling/doctype/customer/customer.py | 11 +++-- .../doctype/sales_order/sales_order.py | 9 ---- .../doctype/delivery_note/delivery_note.py | 19 +++++-- 5 files changed, 66 insertions(+), 29 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index df1284cf39..f37fe6114c 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -224,12 +224,17 @@ class SalesInvoice(SellingController): from erpnext.selling.doctype.customer.customer import check_credit_limit validate_against_credit_limit = False + bypass_credit_limit_check_at_sales_order = cint(frappe.db.get_value("Customer", self.customer, + "bypass_credit_limit_check_at_sales_order")) + if bypass_credit_limit_check_at_sales_order: + validate_against_credit_limit = True + for d in self.get("items"): if not (d.sales_order or d.delivery_note): validate_against_credit_limit = True break if validate_against_credit_limit: - check_credit_limit(self.customer, self.company) + check_credit_limit(self.customer, self.company, bypass_credit_limit_check_at_sales_order) def set_missing_values(self, for_validate=False): pos = self.set_pos_fields(for_validate) diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index b618bf3fbc..b2577d5878 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -1002,9 +1002,9 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "", - "fieldname": "payment_terms", - "fieldtype": "Link", + "default": "0", + "fieldname": "bypass_credit_limit_check_at_sales_order", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -1012,10 +1012,9 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Default Payment Terms Template", + "label": "Bypass credit limit check at Sales Order", "length": 0, "no_copy": 0, - "options": "Payment Terms Template", "permlevel": 0, "precision": "", "print_hide": 0, @@ -1034,9 +1033,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "0", - "fieldname": "bypass_credit_limit_check_at_sales_order", - "fieldtype": "Check", + "fieldname": "column_break_34", + "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -1044,7 +1042,6 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Bypass credit limit check at Sales Order", "length": 0, "no_copy": 0, "permlevel": 0, @@ -1059,6 +1056,38 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "payment_terms", + "fieldtype": "Link", + "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": "Default Payment Terms Template", + "length": 0, + "no_copy": 0, + "options": "Payment Terms Template", + "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, @@ -1354,7 +1383,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-13 18:17:19.894331", + "modified": "2018-01-30 11:52:05.497363", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index eaa82b3713..2284f85374 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -185,12 +185,14 @@ def get_customer_list(doctype, txt, searchfield, start, page_len, filters): ("%%%s%%" % txt, "%%%s%%" % txt, "%%%s%%" % txt, "%%%s%%" % txt, start, page_len)) -def check_credit_limit(customer, company): - customer_outstanding = get_customer_outstanding(customer, company) +def check_credit_limit(customer, company, ignore_outstanding_sales_order=False, extra_amount=0): + customer_outstanding = get_customer_outstanding(customer, company, ignore_outstanding_sales_order) + if extra_amount > 0: + customer_outstanding += flt(extra_amount) credit_limit = get_credit_limit(customer, company) if credit_limit > 0 and flt(customer_outstanding) > credit_limit: - msgprint(_("Credit limit has been crossed for customer {0} {1}/{2}") + msgprint(_("Credit limit has been crossed for customer {0} ({1}/{2})") .format(customer, customer_outstanding, credit_limit)) # If not authorized person raise exception @@ -231,7 +233,8 @@ def get_customer_outstanding(customer, company, ignore_outstanding_sales_order=F and dn.customer=%s and dn.company=%s and dn.docstatus = 1 and dn.status not in ('Closed', 'Stopped') and ifnull(dn_item.against_sales_order, '') = '' - and ifnull(dn_item.against_sales_invoice, '') = ''""", (customer, company), as_dict=True) + and ifnull(dn_item.against_sales_invoice, '') = '' + """, (customer, company), as_dict=True) outstanding_based_on_dn = 0.0 diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 1c3354c212..42cde9f2fd 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -484,11 +484,6 @@ def make_delivery_note(source_name, target_doc=None): else: target.po_no = source.po_no - # Since the credit limit check is bypassed at sales order level, - # we need to check it at delivery note - if cint(frappe.db.get_value("Customer", source.customer, "bypass_credit_limit_check_at_sales_order")): - check_credit_limit(source.customer, source.company) - target.ignore_pricing_rule = 1 target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") @@ -553,10 +548,6 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False): target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") - # Since the credit limit check is bypassed at sales order level, we need to check it at sales invoice - if cint(frappe.db.get_value("Customer", source.customer, "bypass_credit_limit_check_at_sales_order")): - check_credit_limit(source.customer, source.company) - # set company address target.update(get_company_address(target.company)) if target.company_address: diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index dd00398695..65f384f6d9 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -235,13 +235,22 @@ class DeliveryNote(SellingController): def check_credit_limit(self): from erpnext.selling.doctype.customer.customer import check_credit_limit + extra_amount = 0 validate_against_credit_limit = False - for d in self.get("items"): - if not (d.against_sales_order or d.against_sales_invoice): - validate_against_credit_limit = True - break + bypass_credit_limit_check_at_sales_order = cint(frappe.db.get_value("Customer", self.customer, + "bypass_credit_limit_check_at_sales_order")) + if bypass_credit_limit_check_at_sales_order: + validate_against_credit_limit = True + extra_amount = self.base_grand_total + else: + for d in self.get("items"): + if not (d.against_sales_order or d.against_sales_invoice): + validate_against_credit_limit = True + break + if validate_against_credit_limit: - check_credit_limit(self.customer, self.company) + check_credit_limit(self.customer, self.company, + bypass_credit_limit_check_at_sales_order, extra_amount) def validate_packed_qty(self): """ From 2f4854ad1ac5295f30c3222252df36a01bf34f84 Mon Sep 17 00:00:00 2001 From: tundebabzy Date: Tue, 30 Jan 2018 07:48:15 +0100 Subject: [PATCH 04/20] create new dialog everytime (#12696) --- erpnext/stock/doctype/item/item.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 4e61bd9fe6..f7250e47ea 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -317,11 +317,6 @@ $.extend(erpnext.item, { show_multiple_variants_dialog: function(frm) { var me = this; - if(me.multiple_variant_dialog) { - me.multiple_variant_dialog.show(); - return; - } - let promises = []; let attr_val_fields = {}; From ef58be13026c3033b6ccb5aec8d1e4aaec03e827 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Tue, 30 Jan 2018 13:58:43 +0530 Subject: [PATCH 05/20] Fixed education string --- erpnext/education/doctype/guardian/guardian.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/education/doctype/guardian/guardian.py b/erpnext/education/doctype/guardian/guardian.py index 3741a06a90..e82cc546af 100644 --- a/erpnext/education/doctype/guardian/guardian.py +++ b/erpnext/education/doctype/guardian/guardian.py @@ -37,7 +37,6 @@ def invite_guardian(guardian): frappe.throw(_("Please set Email Address")) else: guardian_as_user = frappe.get_value('User', dict(email=guardian_doc.email_address)) - print guardian_as_user if guardian_as_user: frappe.msgprint(_("User {0} already exists").format(getlink("User", guardian_as_user))) return guardian_as_user From 244dcae11049b072a7ea3842aeb921afabf91b62 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Tue, 30 Jan 2018 14:03:59 +0530 Subject: [PATCH 06/20] Fixed spacing --- .../doctype/healthcare_settings/healthcare_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py b/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py index 7206e4b58c..afd4d38f30 100644 --- a/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py +++ b/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py @@ -25,7 +25,7 @@ def get_sms_text(doc): context = {"doc": doc, "alert": doc, "comments": None} emailed = frappe.db.get_value("Healthcare Settings", None, "sms_emailed") sms_text['emailed'] = frappe.render_template(emailed, context) - printed = frappe.db.get_value("Healthcare Settings", None, "sms_printed") + printed = frappe.db.get_value("Healthcare Settings", None, "sms_printed") sms_text['printed'] = frappe.render_template(printed, context) return sms_text From ac57c87bc339d9f32ca6aaf6ba9d42e0f9db6642 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Tue, 30 Jan 2018 14:05:18 +0530 Subject: [PATCH 07/20] Fixed spacing --- .../healthcare_settings.py | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py b/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py index afd4d38f30..0d3d6e7650 100644 --- a/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py +++ b/erpnext/healthcare/doctype/healthcare_settings/healthcare_settings.py @@ -9,60 +9,60 @@ from frappe.core.doctype.sms_settings.sms_settings import send_sms import json class HealthcareSettings(Document): - def validate(self): - for key in ["collect_registration_fee","manage_customer","patient_master_name", - "require_test_result_approval","require_sample_collection", "default_medical_code_standard"]: - frappe.db.set_default(key, self.get(key, "")) - if(self.collect_registration_fee): - if self.registration_fee <= 0 : - frappe.throw("Registration fee can not be Zero") + def validate(self): + for key in ["collect_registration_fee","manage_customer","patient_master_name", + "require_test_result_approval","require_sample_collection", "default_medical_code_standard"]: + frappe.db.set_default(key, self.get(key, "")) + if(self.collect_registration_fee): + if self.registration_fee <= 0 : + frappe.throw("Registration fee can not be Zero") @frappe.whitelist() def get_sms_text(doc): - sms_text = {} - doc = frappe.get_doc("Lab Test",doc) - #doc = json.loads(doc) - context = {"doc": doc, "alert": doc, "comments": None} - emailed = frappe.db.get_value("Healthcare Settings", None, "sms_emailed") - sms_text['emailed'] = frappe.render_template(emailed, context) - printed = frappe.db.get_value("Healthcare Settings", None, "sms_printed") - sms_text['printed'] = frappe.render_template(printed, context) - return sms_text + sms_text = {} + doc = frappe.get_doc("Lab Test",doc) + #doc = json.loads(doc) + context = {"doc": doc, "alert": doc, "comments": None} + emailed = frappe.db.get_value("Healthcare Settings", None, "sms_emailed") + sms_text['emailed'] = frappe.render_template(emailed, context) + printed = frappe.db.get_value("Healthcare Settings", None, "sms_printed") + sms_text['printed'] = frappe.render_template(printed, context) + return sms_text def send_registration_sms(doc): - if (frappe.db.get_value("Healthcare Settings", None, "reg_sms")=='1'): - if doc.mobile: - context = {"doc": doc, "alert": doc, "comments": None} - if doc.get("_comments"): - context["comments"] = json.loads(doc.get("_comments")) - messages = frappe.db.get_value("Healthcare Settings", None, "reg_msg") - messages = frappe.render_template(messages, context) - number = [doc.mobile] - send_sms(number,messages) - else: - frappe.msgprint(doc.name + " Has no mobile number to send registration SMS", alert=True) + if (frappe.db.get_value("Healthcare Settings", None, "reg_sms")=='1'): + if doc.mobile: + context = {"doc": doc, "alert": doc, "comments": None} + if doc.get("_comments"): + context["comments"] = json.loads(doc.get("_comments")) + messages = frappe.db.get_value("Healthcare Settings", None, "reg_msg") + messages = frappe.render_template(messages, context) + number = [doc.mobile] + send_sms(number,messages) + else: + frappe.msgprint(doc.name + " Has no mobile number to send registration SMS", alert=True) def get_receivable_account(company): - receivable_account = get_account(None, "receivable_account", "Healthcare Settings", company) - if receivable_account: - return receivable_account - return frappe.db.get_value("Company", company, "default_receivable_account") + receivable_account = get_account(None, "receivable_account", "Healthcare Settings", company) + if receivable_account: + return receivable_account + return frappe.db.get_value("Company", company, "default_receivable_account") def get_income_account(physician, company): - if(physician): - income_account = get_account("Physician", None, physician, company) - if income_account: - return income_account - income_account = get_account(None, "income_account", "Healthcare Settings", company) - if income_account: - return income_account - return frappe.db.get_value("Company", company, "default_income_account") + if(physician): + income_account = get_account("Physician", None, physician, company) + if income_account: + return income_account + income_account = get_account(None, "income_account", "Healthcare Settings", company) + if income_account: + return income_account + return frappe.db.get_value("Company", company, "default_income_account") def get_account(parent_type, parent_field, parent, company): - if(parent_type): - return frappe.db.get_value("Party Account", - {"parenttype": parent_type, "parent": parent, "company": company}, "account") - if(parent_field): - return frappe.db.get_value("Party Account", - {"parentfield": parent_field, "parent": parent, "company": company}, "account") + if(parent_type): + return frappe.db.get_value("Party Account", + {"parenttype": parent_type, "parent": parent, "company": company}, "account") + if(parent_field): + return frappe.db.get_value("Party Account", + {"parentfield": parent_field, "parent": parent, "company": company}, "account") From b9e8b917b695d244b72062f13b7a062cd7754db8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 15:08:33 +0530 Subject: [PATCH 08/20] Removed ui-tests from travis --- .travis.yml | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/.travis.yml b/.travis.yml index 43b40786be..d6fc930471 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,6 @@ language: python dist: trusty -addons: - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - python: - "2.7" @@ -29,15 +22,6 @@ install: - cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/ before_script: - - wget http://chromedriver.storage.googleapis.com/2.33/chromedriver_linux64.zip - - unzip chromedriver_linux64.zip - - sudo apt-get install libnss3 - - sudo apt-get --only-upgrade install google-chrome-stable - - sudo cp chromedriver /usr/local/bin/. - - sudo chmod +x /usr/local/bin/chromedriver - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start - - sleep 3 - mysql -u root -ptravis -e 'create database test_frappe' - echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root -ptravis - echo "USE mysql;\nGRANT ALL PRIVILEGES ON \`test_frappe\`.* TO 'test_frappe'@'localhost';\n" | mysql -u root -ptravis @@ -58,24 +42,6 @@ jobs: - set -e - bench run-tests env: Server Side Test - - # stage - script: - - bench --verbose run-setup-wizard-ui-test - - bench execute erpnext.setup.utils.enable_all_roles_and_domains - - bench run-ui-tests --app erpnext - env: Client Side Test - - # stage - script: - - bench --verbose run-setup-wizard-ui-test - - bench execute erpnext.setup.utils.enable_all_roles_and_domains - - bench run-ui-tests --app erpnext --test-list erpnext/tests/ui/tests2.txt - env: Client Side Test - 2 - - # stage - script: - - bench --verbose run-setup-wizard-ui-test - - bench execute erpnext.setup.utils.enable_all_roles_and_domains - - bench run-ui-tests --app erpnext --test-list erpnext/tests/ui/agriculture.txt - env: Agriculture Client Side Test - # stage script: - wget http://build.erpnext.com/20171108_190013_955977f8_database.sql.gz From 4eae6c985ca4f0956d4fd91325d313016d6da8d8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 15:27:29 +0530 Subject: [PATCH 09/20] Fixed test records for supplier --- erpnext/buying/doctype/supplier/test_records.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json index 370ce8dad1..2536721326 100644 --- a/erpnext/buying/doctype/supplier/test_records.json +++ b/erpnext/buying/doctype/supplier/test_records.json @@ -8,7 +8,7 @@ { "doctype": "Supplier", "supplier_name": "_Test Supplier P", - "supplier_type": "_Test Supplier Type", + "supplier_type": "_Test Supplier Type" }, { "doctype": "Supplier", From 0f75a022f2dfb5b38a256e39649362b16652afb2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 15:32:17 +0530 Subject: [PATCH 10/20] Minor fix in old patch --- erpnext/patches.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 3a18efc1a6..dbd098d119 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -345,7 +345,7 @@ erpnext.patches.v7_0.repost_bin_qty_and_item_projected_qty erpnext.patches.v7_1.set_prefered_contact_email execute:frappe.reload_doc('accounts', 'doctype', 'accounts_settings') execute:frappe.db.set_value("Accounts Settings", "Accounts Settings", "unlink_payment_on_cancellation_of_invoice", 0) -execute:frappe.db.sql("update `tabStock Entry` set total_amount = null where purpose in('Repack', 'Manufacture')") +execute:frappe.db.sql("update `tabStock Entry` set total_amount = 0 where purpose in('Repack', 'Manufacture')") erpnext.patches.v7_1.save_stock_settings erpnext.patches.v7_0.repost_gle_for_pi_with_update_stock #2016-11-01 erpnext.patches.v7_1.add_account_user_role_for_timesheet From 927d13fadbfa0c813718bfca8373e2d705e7717b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 15:59:44 +0530 Subject: [PATCH 11/20] Minor fix in old patch --- erpnext/patches/v7_0/update_status_of_po_so.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/erpnext/patches/v7_0/update_status_of_po_so.py b/erpnext/patches/v7_0/update_status_of_po_so.py index c0b6f59eaf..d630e8f0f2 100644 --- a/erpnext/patches/v7_0/update_status_of_po_so.py +++ b/erpnext/patches/v7_0/update_status_of_po_so.py @@ -20,7 +20,10 @@ def update_po_per_received_per_billed(): where parent = `tabPurchase Order`.name), 2), `tabPurchase Order`.per_billed = ifnull(round((select sum( if(amount > ifnull(billed_amt, 0), ifnull(billed_amt, 0), amount)) / sum(amount) *100 from `tabPurchase Order Item` - where parent = `tabPurchase Order`.name), 2), 0)""") + where parent = `tabPurchase Order`.name), 2), 0) + where + net_total > 0 + """) def update_so_per_delivered_per_billed(): frappe.db.sql(""" @@ -32,7 +35,10 @@ def update_so_per_delivered_per_billed(): where parent = `tabSales Order`.name), 2), `tabSales Order`.per_billed = ifnull(round((select sum( if(amount > ifnull(billed_amt, 0), ifnull(billed_amt, 0), amount)) / sum(amount) *100 from `tabSales Order Item` - where parent = `tabSales Order`.name), 2), 0)""") + where parent = `tabSales Order`.name), 2), 0) + where + net_total > 0 + """) def update_status(): frappe.db.sql(""" From dba5e7645b03104524429ba60a29d8bdfcfe4100 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 16:38:47 +0530 Subject: [PATCH 12/20] Minor fix in old patch --- .../manufacturing/doctype/production_order/production_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py index 7cfbab002a..d3b7c5a498 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.py +++ b/erpnext/manufacturing/doctype/production_order/production_order.py @@ -490,7 +490,7 @@ class ProductionOrder(Document): and detail.parent = entry.name and detail.item_code = %s''', (self.name, d.item_code))[0][0] - d.db_set('transferred_qty', transferred_qty, update_modified = False) + d.db_set('transferred_qty', flt(transferred_qty), update_modified = False) @frappe.whitelist() From 39f3d7e3aac23d11442dfbebed7dc9dcfca64c42 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Tue, 30 Jan 2018 16:58:49 +0530 Subject: [PATCH 13/20] local import --- erpnext/setup/setup_wizard/setup_wizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 2c5f7e8456..d6491a8659 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from operations import install_fixtures, taxes_setup, defaults_setup, company_setup, sample_data +from .operations import install_fixtures, taxes_setup, defaults_setup, company_setup, sample_data def get_setup_stages(args=None): if frappe.db.sql("select name from tabCompany"): From bc640fe6a62f525de597be884d9116e18f019f0e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 30 Jan 2018 19:26:28 +0530 Subject: [PATCH 14/20] minor fix in old patch --- erpnext/patches/v8_1/set_delivery_date_in_so_item.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py index aa5cbc50bc..e3e23a584e 100644 --- a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py +++ b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py @@ -13,11 +13,11 @@ def execute(): frappe.db.sql(""" update `tabSales Order` so, `tabSales Order Item` so_item - set so_item.delivery_date = so.delivery_date + set so_item.delivery_date = if(ifnull(so.delivery_date, '0000-00-00'), ifnull(so.delivery_date, '0000-00-00'), '0000-00-00') where so.name = so_item.parent and so.order_type = 'Sales' and (so_item.delivery_date is null or so_item.delivery_date = '' or so_item.delivery_date = '0000-00-00') - and (so.delivery_date is not null and so.delivery_date != '' + and (so.delivery_date is not null and so.delivery_date != '' and so.delivery_date != "" and so.delivery_date != '0000-00-00') """) From f6daf5605455843a26a76168f9d82809c12ad0c2 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira <33246109+kennethsequeira@users.noreply.github.com> Date: Wed, 31 Jan 2018 12:49:58 +0530 Subject: [PATCH 15/20] Added Tutorial Videos for Education in User Manual (#12678) * added erpnext education tutorial videos to the manual * testing with div * Update program-enrollment.md Properly ended YouTube video. * removed group assessment criteria page --- .../{student group.gif => student-group.gif} | Bin .../Assessment/assessment_criteria.md | 13 +++++++++++++ .../Assessment/assessment_criteria_group.md | 1 - .../education/Assessment/assessment_group.md | 13 +++++++++++++ .../en/education/Assessment/assessment_plan.md | 13 +++++++++++++ .../education/Assessment/assessment_result.md | 12 ++++++++++++ .../Assessment/assessment_result_tool.md | 13 +++++++++++++ .../en/education/Assessment/grading_scale.md | 13 +++++++++++++ .../manual/en/education/Attendance/index.txt | 4 ++-- .../Attendance/student-attendance-tool.md | 13 +++++++++++++ .../education/Attendance/student-attendance.md | 13 +++++++++++++ .../Attendance/student-leave-application.md | 13 +++++++++++++ .../admission/program-enrollment-tool.md | 12 ++++++++++++ .../education/admission/program-enrollment.md | 12 +++++++++++- .../education/admission/student-applicant.md | 12 ++++++++++++ .../manual/en/education/fees/fee-structure.md | 12 ++++++++++++ .../en/education/schedule/course-schedule.md | 12 ++++++++++++ .../en/education/schedule/scheduling-tool.md | 10 ++++++++++ .../user/manual/en/education/setup/course.md | 14 ++++++++++++++ .../manual/en/education/setup/instructor.md | 11 +++++++++++ .../user/manual/en/education/setup/program.md | 14 +++++++++++++- .../en/education/setup/school-settings.md | 2 +- .../student/student-group-creation-tool.md | 14 +++++++++++++- .../en/education/student/student-group.md | 17 +++++++++++++++-- .../manual/en/education/student/student.md | 12 ++++++++++++ 25 files changed, 266 insertions(+), 9 deletions(-) rename erpnext/docs/assets/img/education/student/{student group.gif => student-group.gif} (100%) delete mode 100644 erpnext/docs/user/manual/en/education/Assessment/assessment_criteria_group.md diff --git a/erpnext/docs/assets/img/education/student/student group.gif b/erpnext/docs/assets/img/education/student/student-group.gif similarity index 100% rename from erpnext/docs/assets/img/education/student/student group.gif rename to erpnext/docs/assets/img/education/student/student-group.gif diff --git a/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md index b97cfb1259..64183ad8be 100644 --- a/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md @@ -10,4 +10,17 @@ Assessment Criteria is be used when scheduling Assessment Plan for Student Group Assessment Plan Criteria +#### Video Tutorial on Assessment Criteria + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria_group.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria_group.md deleted file mode 100644 index 4287ca8617..0000000000 --- a/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria_group.md +++ /dev/null @@ -1 +0,0 @@ -# \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Assessment/assessment_group.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_group.md index ed02a5366d..35e00ad3d5 100644 --- a/erpnext/docs/user/manual/en/education/Assessment/assessment_group.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_group.md @@ -10,4 +10,17 @@ On the same lines, you can also define multiple Assessment Group bases on assess Assessment Group Term +#### Video Tutorial on Assessment Group + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md index 7272279c9b..8e08535514 100644 --- a/erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md @@ -16,4 +16,17 @@ To schedule an assessment/examination for a Student Group, for specific Course, Assessment Plan Criteria +#### Video Tutorial on Assessment Plan + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Assessment/assessment_result.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_result.md index ed3e5fb334..5547f2247b 100644 --- a/erpnext/docs/user/manual/en/education/Assessment/assessment_result.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_result.md @@ -4,4 +4,16 @@ Assessment Result is a log of marks/grades earned by the student for specific As Assessment Result +#### Video Tutorial on Assessment Result + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md index 88b7a7a078..1cd0762faa 100644 --- a/erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md @@ -6,4 +6,17 @@ Assessment Result Tool help you entering marks earned by the Students for specif As you go on entering marks for a Student, and switch to next student, in the backend, Student Result record will be auto-created for that Student. +#### Video Tutorial on Assessment Result Tool + + + +
+ +
+ +
+
+ {next} diff --git a/erpnext/docs/user/manual/en/education/Assessment/grading_scale.md b/erpnext/docs/user/manual/en/education/Assessment/grading_scale.md index 0ad610b633..c3d8b2127a 100644 --- a/erpnext/docs/user/manual/en/education/Assessment/grading_scale.md +++ b/erpnext/docs/user/manual/en/education/Assessment/grading_scale.md @@ -4,4 +4,17 @@ In the Grading Scale, you can define various grades and threshold for them. Base Grading Scale +#### Video Tutorial on Grading Scale + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Attendance/index.txt b/erpnext/docs/user/manual/en/education/Attendance/index.txt index 8cd02627a2..14ecda3814 100644 --- a/erpnext/docs/user/manual/en/education/Attendance/index.txt +++ b/erpnext/docs/user/manual/en/education/Attendance/index.txt @@ -1,3 +1,3 @@ student-attendance -student-leave-application -student-attendance-tool \ No newline at end of file +student-attendance-tool +student-leave-application \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md b/erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md index fac9d6e69d..c68f473db0 100644 --- a/erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md +++ b/erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md @@ -12,4 +12,17 @@ Student detials will be autofetched and you can mark the attendance of the given Student Attendance +#### Tutorial Video for Student Attendance Tool + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Attendance/student-attendance.md b/erpnext/docs/user/manual/en/education/Attendance/student-attendance.md index 4be2831f30..b93114607e 100644 --- a/erpnext/docs/user/manual/en/education/Attendance/student-attendance.md +++ b/erpnext/docs/user/manual/en/education/Attendance/student-attendance.md @@ -12,4 +12,17 @@ Select the **Student, Course Schedule and Student Group** for which attendance i **Student Attendance tool** can be used for bulk updation of the attendance based on **Batch, Course or Activity**. +#### Tutorial Video on Student Attendance + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md b/erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md index e22c6e9d68..011d07c94c 100644 --- a/erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md +++ b/erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md @@ -10,4 +10,17 @@ Incase the student is not attending the institute in order to participate or rep Once a Leave Application is recorded for a student it will not be recorded in the absent student report as he has applied for a leave. +#### Tutorial Video for Student Leave Application + + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md b/erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md index 97a26c73ce..5727bc230b 100644 --- a/erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md +++ b/erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md @@ -18,4 +18,16 @@ You can create the Program Enrollment for : For promoting the students, the new academic year, academic term and program can also be selected for the enrollment of the fetched students list. +#### Video Tutorial for Program Enrollment Tool + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/admission/program-enrollment.md b/erpnext/docs/user/manual/en/education/admission/program-enrollment.md index 6fe9692a89..36af3f263e 100644 --- a/erpnext/docs/user/manual/en/education/admission/program-enrollment.md +++ b/erpnext/docs/user/manual/en/education/admission/program-enrollment.md @@ -17,5 +17,15 @@ Student Batch: To categorize student into different sections/batches, you can as Student Category: For the Institutions having multiple Fees Structure, this field can be used to differentiate the student enrollment in a given fee category. +#### Video Tutorial For Program Enrollment -{next} \ No newline at end of file + +
+ +
+ +
+
+ +{next} diff --git a/erpnext/docs/user/manual/en/education/admission/student-applicant.md b/erpnext/docs/user/manual/en/education/admission/student-applicant.md index 121844cf9a..fa1b4c2c75 100644 --- a/erpnext/docs/user/manual/en/education/admission/student-applicant.md +++ b/erpnext/docs/user/manual/en/education/admission/student-applicant.md @@ -27,4 +27,16 @@ the system shall create a student against that applicant and redirect you to the Student Applicant Enrollment +#### Video Tutorial for Student Application + + + +
+ +
+ +
+
+ {next} diff --git a/erpnext/docs/user/manual/en/education/fees/fee-structure.md b/erpnext/docs/user/manual/en/education/fees/fee-structure.md index 2131c4afed..76d43a4783 100644 --- a/erpnext/docs/user/manual/en/education/fees/fee-structure.md +++ b/erpnext/docs/user/manual/en/education/fees/fee-structure.md @@ -20,4 +20,16 @@ You can set the "Income Account" and "Receivable Account" in the Accounts sectio If you are going to use this in the Fee Schedule, you must select the Accounts carefully as Fee Schedule updates the respected Accounts in bulk. +#### Video Tutorial for Fee Structure + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/schedule/course-schedule.md b/erpnext/docs/user/manual/en/education/schedule/course-schedule.md index f5134d59ff..8b8a36eb15 100644 --- a/erpnext/docs/user/manual/en/education/schedule/course-schedule.md +++ b/erpnext/docs/user/manual/en/education/schedule/course-schedule.md @@ -5,6 +5,18 @@ You can see the overall course schedule in the Calendar view. Course Schedule +#### Video Tutorial on Course Scheduling + + +
+ +
+ +
+
+ ### Marking Attendance You can mark attendance for a Student Group against a Course Schedule. diff --git a/erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md b/erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md index 08a7fa9ec0..087c933fe3 100644 --- a/erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md +++ b/erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md @@ -20,4 +20,14 @@ This tool can be used to create 'Course Schedules'. - Check the 'Reschedule' checkbox and then click 'Schedule Course' button. - System will delete existing Course Schedules for specified Course within the mentioned Course Start Date and Course End Date and crate new Course Schedules. +#### Video Tutorial on Scheduling Tool + +
+ +
+ +
+
+ {next} diff --git a/erpnext/docs/user/manual/en/education/setup/course.md b/erpnext/docs/user/manual/en/education/setup/course.md index 0d6e5ac5eb..ec7d813056 100644 --- a/erpnext/docs/user/manual/en/education/setup/course.md +++ b/erpnext/docs/user/manual/en/education/setup/course.md @@ -12,4 +12,18 @@ Once a **Course** is created, a course schedule can defined for the same. The Course form is further linked to **Program, Student Group and Assessment Plan** doctypes. The links allow to view/create the related documents for a **Course**. +#### Video Tutorial for Course + + + +
+ +
+ +
+
+ + {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/setup/instructor.md b/erpnext/docs/user/manual/en/education/setup/instructor.md index 219413d275..5af4cc098e 100644 --- a/erpnext/docs/user/manual/en/education/setup/instructor.md +++ b/erpnext/docs/user/manual/en/education/setup/instructor.md @@ -16,5 +16,16 @@ While creating the **Assessment Plan** for a Student Group, **Instructor** can b Further, the log for the Instructor can be entered in the Instructor Log table which can be used for keeping the records of subjects taught by that Instructor. +#### Video Tutorial for Instructor + + +
+ +
+ +
+
{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/setup/program.md b/erpnext/docs/user/manual/en/education/setup/program.md index 25e390eb87..0d2a4d2994 100644 --- a/erpnext/docs/user/manual/en/education/setup/program.md +++ b/erpnext/docs/user/manual/en/education/setup/program.md @@ -4,7 +4,7 @@ An educational program is a program written by the institutions which determines To create a Program go to : -###education >> Setup >> Program >> New Program +> Education > Setup > Program > New Program Enter a unique code for every **Program**. You can also link the **Program** to the department under which it is conducted. @@ -16,4 +16,16 @@ Add the relevant Course and the Fee details for a program. The Program Doctype is further linked to the **Student applicant**, **Program enrollment, Student group, Fee structre and Fee**. The links allow to view or create the related document for a Program. +#### Video Tutorial on Program and Courses + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/setup/school-settings.md b/erpnext/docs/user/manual/en/education/setup/school-settings.md index 44f9c44ed1..74e5ed561f 100644 --- a/erpnext/docs/user/manual/en/education/setup/school-settings.md +++ b/erpnext/docs/user/manual/en/education/setup/school-settings.md @@ -2,7 +2,7 @@ The Education Settings page allow you to setup basic settings like **Academic Year and Term** for the educational setup. -Student +Student The checkbox to Validate Batch for Students in Student Group enables the Student Batch validation for every Student from the Program Enrollment for the **Batch** based on **Student Group** diff --git a/erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md b/erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md index aeedd97a2e..d27f4f74f6 100644 --- a/erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md +++ b/erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md @@ -4,7 +4,7 @@ The Student group creation tool allows you to create student groups in bulk. To create Student group using this tool go to -##education >>Student >> Student Group creation tool +> Education > Student > Student Group creation tool Select the **Academic Term** and the **Program** for which a student group is to be created. @@ -14,4 +14,16 @@ By default the student group is created based on the **Course** only. The check You can leave it unchecked if you don't want to consider batch while making course based groups. +#### Tutorial Video on Student Group Creation Tool + + +
+ +
+ +
+
+ {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/student/student-group.md b/erpnext/docs/user/manual/en/education/student/student-group.md index 467fb3e84e..be68df1e73 100644 --- a/erpnext/docs/user/manual/en/education/student/student-group.md +++ b/erpnext/docs/user/manual/en/education/student/student-group.md @@ -6,9 +6,9 @@ A Student Group needs to be created for every course for **Academic Term** and * To create a Student Group go to: -education >> Student >> New Student Group +> Education > Student > New Student Group -Student Group +Student Group To create a Student group based on **Batch**, select the **Progam** and **Batch**, where as to create a Student group based on **Course**, you will only have to select the Course Code. Creating a student group based on activity allows you to group of student for events and activities happening in the institute. @@ -18,5 +18,18 @@ Once a student group is created you can mark attendance for the group. You can also update the **Email Group** for the Student Group. Click on Update Email Group to add all the email ids of the gaurdians in the respective email group and **Newsletter** can be created and sent to the Email group. +#### Tutorial Video on Student Groups + + + +
+ +
+ +
+
{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/student/student.md b/erpnext/docs/user/manual/en/education/student/student.md index fce5d7ba8a..9799e80a69 100644 --- a/erpnext/docs/user/manual/en/education/student/student.md +++ b/erpnext/docs/user/manual/en/education/student/student.md @@ -4,9 +4,21 @@ A Student is a person who has enrolled at your institute and you have accepted t The Student doctype maintains detials like personal information, date of birth, address etc. It also records the **Guardian** and sibling details. Student + The student is enrolled in a **Program** when the application is approved. Once the enrollement is done the **Student Applicant** status is update to Admitted. You can view every doctype created for a particular student. Eg : Fees, Student Group, etc +#### Video Tutorial on Student Management + + +
+ +
+ +
+
{next} \ No newline at end of file From dea99cc3a8b22d4bd6258f21ba9c3aa7a10429bb Mon Sep 17 00:00:00 2001 From: Zarrar Date: Wed, 31 Jan 2018 13:07:04 +0530 Subject: [PATCH 16/20] treeview not set when routed from bom form (#12707) --- erpnext/manufacturing/doctype/bom/bom.py | 2 +- erpnext/manufacturing/doctype/bom/bom_tree.js | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index a06645ad9f..fb52d5260c 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -592,7 +592,7 @@ def validate_bom_no(item, bom_no): @frappe.whitelist() def get_children(doctype, parent=None, is_root=False, **filters): - if not parent: + if not parent or parent=="BOM": frappe.msgprint(_('Please select a BOM')) return diff --git a/erpnext/manufacturing/doctype/bom/bom_tree.js b/erpnext/manufacturing/doctype/bom/bom_tree.js index 854f6334d7..6cbd7a2ab1 100644 --- a/erpnext/manufacturing/doctype/bom/bom_tree.js +++ b/erpnext/manufacturing/doctype/bom/bom_tree.js @@ -11,7 +11,8 @@ frappe.treeview_settings["BOM"] = { title: "BOM", breadcrumb: "Manufacturing", disable_add_node: true, - root_label: "All Bill of Materials", //fieldname from filters + root_label: "BOM", //fieldname from filters + get_tree_root: false, get_label: function(node) { if(node.data.qty) { return node.data.qty + " x " + node.data.item_code; @@ -19,6 +20,23 @@ frappe.treeview_settings["BOM"] = { return node.data.item_code || node.data.value; } }, + onload: function(me) { + var label = frappe.get_route()[0] + "/" + frappe.get_route()[1]; + if(frappe.pages[label]) { + delete frappe.pages[label]; + } + + var filter = me.opts.filters[0]; + if(frappe.route_options && frappe.route_options[filter.fieldname]) { + var val = frappe.route_options[filter.fieldname]; + delete frappe.route_options[filter.fieldname]; + filter.default = ""; + me.args[filter.fieldname] = val; + me.root_label = val; + me.page.set_title(val); + } + me.make_tree(); + }, toolbar: [ { toggle_btn: true }, { From e37e5d61343bb06bc5721bee13f9a31fcafad308 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 31 Jan 2018 14:59:59 +0530 Subject: [PATCH 17/20] minor fix in patch for mariadb version --- erpnext/patches/v8_1/set_delivery_date_in_so_item.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py index e3e23a584e..2e81571072 100644 --- a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py +++ b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py @@ -8,16 +8,14 @@ def execute(): frappe.db.sql(""" update `tabSales Order` set delivery_date = final_delivery_date - where (delivery_date is null or delivery_date = '' or delivery_date = '0000-00-00') + where (delivery_date is null or delivery_date = '0000-00-00') and order_type = 'Sales'""") frappe.db.sql(""" update `tabSales Order` so, `tabSales Order Item` so_item - set so_item.delivery_date = if(ifnull(so.delivery_date, '0000-00-00'), ifnull(so.delivery_date, '0000-00-00'), '0000-00-00') + set so_item.delivery_date = so.delivery_date where so.name = so_item.parent and so.order_type = 'Sales' - and (so_item.delivery_date is null or so_item.delivery_date = '' - or so_item.delivery_date = '0000-00-00') - and (so.delivery_date is not null and so.delivery_date != '' and so.delivery_date != "" - and so.delivery_date != '0000-00-00') - """) + and (so_item.delivery_date is null or so_item.delivery_date = '0000-00-00') + and (so.delivery_date is not null and so.delivery_date != '0000-00-00') + """) \ No newline at end of file From 7918b92d951ffa058a15476a48ad78523ae86766 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 31 Jan 2018 15:30:03 +0530 Subject: [PATCH 18/20] Invalid date value comparison, fixes for mariadb 10.2.3+ --- erpnext/accounts/doctype/tax_rule/tax_rule.py | 4 ++-- erpnext/controllers/queries.py | 2 +- erpnext/patches/v7_1/set_currency_exchange_date.py | 2 +- erpnext/patches/v7_2/rename_att_date_attendance.py | 2 +- erpnext/patches/v7_2/update_salary_slips.py | 3 +-- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py index 9c091e8c9d..2e92e05458 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py @@ -130,8 +130,8 @@ def get_party_details(party, party_type, args=None): def get_tax_template(posting_date, args): """Get matching tax rule""" args = frappe._dict(args) - conditions = ["""(from_date is null or from_date = '' or from_date <= '{0}') - and (to_date is null or to_date = '' or to_date >= '{0}')""".format(posting_date)] + conditions = ["""(from_date is null or from_date <= '{0}') + and (to_date is null or to_date >= '{0}')""".format(posting_date)] for key, value in args.iteritems(): if key=="use_for_shopping_cart": diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 53f9ecb986..139586f1e2 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -257,7 +257,7 @@ def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, def get_batch_no(doctype, txt, searchfield, start, page_len, filters): cond = "" if filters.get("posting_date"): - cond = "and (ifnull(batch.expiry_date, '')='' or batch.expiry_date >= %(posting_date)s)" + cond = "and (batch.expiry_date is null or batch.expiry_date >= %(posting_date)s)" batch_nos = None args = { diff --git a/erpnext/patches/v7_1/set_currency_exchange_date.py b/erpnext/patches/v7_1/set_currency_exchange_date.py index 7d8e4f0415..630b7d4229 100644 --- a/erpnext/patches/v7_1/set_currency_exchange_date.py +++ b/erpnext/patches/v7_1/set_currency_exchange_date.py @@ -5,5 +5,5 @@ def execute(): frappe.db.sql(""" update `tabCurrency Exchange` set `date` = '2010-01-01' - where date is null or date = '' or date = '0000-00-00' + where date is null or date = '0000-00-00' """) \ No newline at end of file diff --git a/erpnext/patches/v7_2/rename_att_date_attendance.py b/erpnext/patches/v7_2/rename_att_date_attendance.py index f7caf706db..b2658ba7f1 100644 --- a/erpnext/patches/v7_2/rename_att_date_attendance.py +++ b/erpnext/patches/v7_2/rename_att_date_attendance.py @@ -7,7 +7,7 @@ def execute(): frappe.reload_doc("hr", "doctype", "attendance") frappe.db.sql("""update `tabAttendance` set attendance_date = att_date - where attendance_date is null or attendance_date = '' or attendance_date = '0000-00-00'""") + where attendance_date is null or attendance_date = '0000-00-00'""") update_reports("Attendance", "att_date", "attendance_date") update_users_report_view_settings("Attendance", "att_date", "attendance_date") diff --git a/erpnext/patches/v7_2/update_salary_slips.py b/erpnext/patches/v7_2/update_salary_slips.py index 22bb1d82dc..c6bca8e7b9 100644 --- a/erpnext/patches/v7_2/update_salary_slips.py +++ b/erpnext/patches/v7_2/update_salary_slips.py @@ -9,8 +9,7 @@ def execute(): salary_slips = frappe.db.sql("""select month, name, fiscal_year from `tabSalary Slip` where (month is not null and month != '') and - (start_date is null or start_date = '') and - (end_date is null or end_date = '') and docstatus != 2""", as_dict=True) + start_date is null and end_date is null and docstatus != 2""", as_dict=True) for salary_slip in salary_slips: if not cint(salary_slip.month): From 4e05f02038c137001b06b905b8028611c1f66ba2 Mon Sep 17 00:00:00 2001 From: Zarrar Date: Wed, 31 Jan 2018 15:33:51 +0530 Subject: [PATCH 19/20] error in throw message rectify (#12719) --- erpnext/stock/doctype/batch/batch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py index 1c66ea6443..eca0475974 100644 --- a/erpnext/stock/doctype/batch/batch.py +++ b/erpnext/stock/doctype/batch/batch.py @@ -116,7 +116,7 @@ def set_batch_nos(doc, warehouse_field, throw = False): else: batch_qty = get_batch_qty(batch_no=d.batch_no, warehouse=warehouse) if flt(batch_qty, d.precision("qty")) < flt(qty, d.precision("qty")): - frappe.throw(_("Row #{0}: The batch {1} has only {2} qty. Please select another batch which has {3} qty available or split the row into multiple rows, to deliver/issue from multiple batches").format(d.idx, d.batch_no, batch_qty, d.stock_qty)) + frappe.throw(_("Row #{0}: The batch {1} has only {2} qty. Please select another batch which has {3} qty available or split the row into multiple rows, to deliver/issue from multiple batches").format(d.idx, d.batch_no, batch_qty, qty)) @frappe.whitelist() def get_batch_no(item_code, warehouse, qty=1, throw=False): From bff1971bb277794cae2cef9c047d46a8cd87a433 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 31 Jan 2018 16:09:15 +0600 Subject: [PATCH 20/20] bumped to version 10.0.18 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 1b88bdc5b9..96ad60f866 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -5,7 +5,7 @@ import frappe from erpnext.hooks import regional_overrides from frappe.utils import getdate -__version__ = '10.0.17' +__version__ = '10.0.18' def get_default_company(user=None): '''Get default company for user'''