From 9275969b51a21be0a5c400e29a194475f6aabf4c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 15 Aug 2017 08:23:51 +0530 Subject: [PATCH 001/164] Payment Terms: doctypes, schedule, payments and more fix payment terms template setup: - add_fetch to correct credit_days and credit_months not credit_days_months fixed bug in `make_customer_gl_entry` and `make_supplier_entry: all sales invoice were failing because they were all attempting to make gl entry from payment schedule. Same with purchase invoices --- .../accounts/doctype/gl_entry/gl_entry.json | 32 +- .../doctype/payment_entry/payment_entry.py | 56 ++- .../doctype/payment_schedule/__init__.py | 0 .../payment_schedule/payment_schedule.json | 197 ++++++++++ .../payment_schedule/payment_schedule.py | 10 + .../accounts/doctype/payment_term/__init__.py | 0 .../doctype/payment_term/payment_term.js | 8 + .../doctype/payment_term/payment_term.json | 344 ++++++++++++++++++ .../doctype/payment_term/payment_term.py | 10 + .../doctype/payment_term/test_payment_term.js | 23 ++ .../doctype/payment_term/test_payment_term.py | 10 + .../payment_terms_template/__init__.py | 0 .../payment_terms_template.js | 12 + .../payment_terms_template.json | 164 +++++++++ .../payment_terms_template.py | 10 + .../test_payment_terms_template.js | 23 ++ .../test_payment_terms_template.py | 10 + .../payment_terms_template_detail/__init__.py | 0 .../payment_terms_template_detail.json | 229 ++++++++++++ .../payment_terms_template_detail.py | 10 + .../purchase_invoice/purchase_invoice.py | 22 +- .../doctype/sales_invoice/sales_invoice.json | 100 ++++- .../doctype/sales_invoice/sales_invoice.py | 51 ++- .../sales_invoice/test_sales_invoice.js | 1 - .../sales_invoice/test_sales_invoice.py | 34 +- erpnext/accounts/general_ledger.py | 5 +- .../accounts_receivable.py | 12 +- erpnext/accounts/utils.py | 12 +- erpnext/controllers/accounts_controller.py | 43 ++- erpnext/public/js/controllers/transaction.js | 40 ++ 30 files changed, 1436 insertions(+), 32 deletions(-) create mode 100644 erpnext/accounts/doctype/payment_schedule/__init__.py create mode 100644 erpnext/accounts/doctype/payment_schedule/payment_schedule.json create mode 100644 erpnext/accounts/doctype/payment_schedule/payment_schedule.py create mode 100644 erpnext/accounts/doctype/payment_term/__init__.py create mode 100644 erpnext/accounts/doctype/payment_term/payment_term.js create mode 100644 erpnext/accounts/doctype/payment_term/payment_term.json create mode 100644 erpnext/accounts/doctype/payment_term/payment_term.py create mode 100644 erpnext/accounts/doctype/payment_term/test_payment_term.js create mode 100644 erpnext/accounts/doctype/payment_term/test_payment_term.py create mode 100644 erpnext/accounts/doctype/payment_terms_template/__init__.py create mode 100644 erpnext/accounts/doctype/payment_terms_template/payment_terms_template.js create mode 100644 erpnext/accounts/doctype/payment_terms_template/payment_terms_template.json create mode 100644 erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py create mode 100644 erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.js create mode 100644 erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py create mode 100644 erpnext/accounts/doctype/payment_terms_template_detail/__init__.py create mode 100644 erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json create mode 100644 erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index 76e66d0906b..e27eaabedcc 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -74,6 +74,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "due_date", + "fieldtype": "Date", + "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": "Due Date", + "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, @@ -718,7 +748,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-03 12:40:09.611951", + "modified": "2017-08-10 18:06:44.904081", "modified_by": "Administrator", "module": "Accounts", "name": "GL Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 7bb9a52ee6f..9534f514c1f 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -410,7 +410,8 @@ class PaymentEntry(AccountsController): gle = party_gl_dict.copy() gle.update({ "against_voucher_type": d.reference_doctype, - "against_voucher": d.reference_name + "against_voucher": d.reference_name, + "due_date": d.due_date }) allocated_amount_in_company_currency = flt(flt(d.allocated_amount) * flt(d.exchange_rate), @@ -742,18 +743,53 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= pe.allocate_payment_amount = 1 pe.letter_head = doc.get("letter_head") - pe.append("references", { - "reference_doctype": dt, - "reference_name": dn, - "due_date": doc.get("due_date"), - "total_amount": grand_total, - "outstanding_amount": outstanding_amount, - "allocated_amount": outstanding_amount - }) + if doc.get("payment_schedule"): + for d in doc.get("payment_schedule"): + invoice_amount = d.payment_amount * doc.conversion_rate \ + if party_account_currency == doc.company_currency else d.payment_amount + paid_amount = get_paid_amount(dt, dn, party_type, pe.party, party_account, d.due_date) + outstanding_amount = invoice_amount - paid_amount + pe.append("references", { + "reference_doctype": dt, + "reference_name": dn, + "due_date": d.due_date, + "total_amount": invoice_amount, + "outstanding_amount": outstanding_amount, + "allocated_amount": outstanding_amount + }) + else: + pe.append("references", { + "reference_doctype": dt, + "reference_name": dn, + "due_date": doc.get("due_date"), + "total_amount": grand_total, + "outstanding_amount": outstanding_amount, + "allocated_amount": outstanding_amount + }) pe.setup_party_account_field() pe.set_missing_values() if party_account and bank: pe.set_exchange_rate() pe.set_amounts() - return pe \ No newline at end of file + return pe + +def get_paid_amount(dt, dn, party_type, party, account, due_date): + if party_type=="Customer": + dr_or_cr = "credit_in_account_currency - debit_in_account_currency" + else: + dr_or_cr = "debit_in_account_currency - credit_in_account_currency" + + paid_amount = frappe.db.sql(""" + select ifnull(sum({dr_or_cr}), 0) as paid_amount + from `tabGL Entry` + where against_voucher_type = %s + and against_voucher = %s + and party_type = %s + and party = %s + and account = %s + and due_date = %s + and {dr_or_cr} > 0 + """.format(dr_or_cr=dr_or_cr), (dt, dn, party_type, party, account, due_date)) + + return paid_amount[0][0] if paid_amount else 0 \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_schedule/__init__.py b/erpnext/accounts/doctype/payment_schedule/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json new file mode 100644 index 00000000000..45a81b0ab47 --- /dev/null +++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json @@ -0,0 +1,197 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "", + "beta": 0, + "creation": "2017-08-10 15:38:00.080575", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "payment_term", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payment Term", + "length": 0, + "no_copy": 0, + "options": "Payment Term", + "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": 2, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "options": "payment_term.description", + "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": 2, + "fieldname": "due_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Due Date", + "length": 0, + "no_copy": 0, + "options": "payment_term.due_date", + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "invoice_portion", + "fieldtype": "Percent", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Invoice Portion", + "length": 0, + "no_copy": 0, + "options": "payment_term.invoice_portion", + "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": 2, + "fieldname": "payment_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payment Amount", + "length": 0, + "no_copy": 0, + "options": "currency", + "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2017-08-10 18:09:42.122027", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Payment Schedule", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.py b/erpnext/accounts/doctype/payment_schedule/payment_schedule.py new file mode 100644 index 00000000000..75bacc64067 --- /dev/null +++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, 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 PaymentSchedule(Document): + pass diff --git a/erpnext/accounts/doctype/payment_term/__init__.py b/erpnext/accounts/doctype/payment_term/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/payment_term/payment_term.js b/erpnext/accounts/doctype/payment_term/payment_term.js new file mode 100644 index 00000000000..564a2a6d3be --- /dev/null +++ b/erpnext/accounts/doctype/payment_term/payment_term.js @@ -0,0 +1,8 @@ +// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Payment Term', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/accounts/doctype/payment_term/payment_term.json b/erpnext/accounts/doctype/payment_term/payment_term.json new file mode 100644 index 00000000000..702319ba74d --- /dev/null +++ b/erpnext/accounts/doctype/payment_term/payment_term.json @@ -0,0 +1,344 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:payment_term_name", + "beta": 0, + "creation": "2017-08-10 15:24:54.876365", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "payment_term_name", + "fieldtype": "Data", + "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": "Payment Term 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": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "invoice_portion", + "fieldtype": "Float", + "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": "Invoice Portion", + "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, + "fieldname": "column_break_3", + "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": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "due_date_based_on", + "fieldtype": "Select", + "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": "Due Date Based On", + "length": 0, + "no_copy": 0, + "options": "Day(s) after invoice date\nDay(s) after the end of the invoice month\nMonth(s) after the end of the invoice month", + "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": 1, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:in_list(['Day(s) after invoice date', 'Day(s) after the end of the invoice month'], doc.due_date_based_on)", + "fieldname": "credit_days", + "fieldtype": "Int", + "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": "Credit Days", + "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, + "depends_on": "eval:doc.due_date_based_on=='Month(s) after the end of the invoice month'", + "fieldname": "credit_months", + "fieldtype": "Int", + "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": "Credit Months", + "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, + "fieldname": "section_break_6", + "fieldtype": "Section 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": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "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": "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-08-10 16:26:03.581501", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Payment Term", + "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, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_term/payment_term.py b/erpnext/accounts/doctype/payment_term/payment_term.py new file mode 100644 index 00000000000..93a7529a113 --- /dev/null +++ b/erpnext/accounts/doctype/payment_term/payment_term.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, 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 PaymentTerm(Document): + pass diff --git a/erpnext/accounts/doctype/payment_term/test_payment_term.js b/erpnext/accounts/doctype/payment_term/test_payment_term.js new file mode 100644 index 00000000000..b26e42aa37d --- /dev/null +++ b/erpnext/accounts/doctype/payment_term/test_payment_term.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Payment Term", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Payment Term + () => frappe.tests.make('Payment Term', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/accounts/doctype/payment_term/test_payment_term.py b/erpnext/accounts/doctype/payment_term/test_payment_term.py new file mode 100644 index 00000000000..c4d5d375942 --- /dev/null +++ b/erpnext/accounts/doctype/payment_term/test_payment_term.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestPaymentTerm(unittest.TestCase): + pass diff --git a/erpnext/accounts/doctype/payment_terms_template/__init__.py b/erpnext/accounts/doctype/payment_terms_template/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.js b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.js new file mode 100644 index 00000000000..558297fea76 --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.js @@ -0,0 +1,12 @@ +// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Payment Terms Template', { + setup: function(frm) { + frm.add_fetch("payment_term", "description", "description"); + frm.add_fetch("payment_term", "invoice_portion", "invoice_portion"); + frm.add_fetch("payment_term", "due_date_based_on", "due_date_based_on"); + frm.add_fetch("payment_term", "credit_days", "credit_days"); + frm.add_fetch("payment_term", "credit_months", "credit_months"); + } +}); diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.json b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.json new file mode 100644 index 00000000000..095965886d4 --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.json @@ -0,0 +1,164 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:template_name", + "beta": 0, + "creation": "2017-08-10 15:34:28.058054", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "template_name", + "fieldtype": "Data", + "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": "Template 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": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "terms", + "fieldtype": "Table", + "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": "Payment Terms", + "length": 0, + "no_copy": 0, + "options": "Payment Terms Template Detail", + "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-08-10 15:46:33.877884", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Payment Terms Template", + "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, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py new file mode 100644 index 00000000000..3300a1122c8 --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, 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 PaymentTermsTemplate(Document): + pass diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.js b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.js new file mode 100644 index 00000000000..494a0ed21fb --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Payment Terms Template", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Payment Terms Template + () => frappe.tests.make('Payment Terms Template', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py new file mode 100644 index 00000000000..33d256c58ac --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestPaymentTermsTemplate(unittest.TestCase): + pass diff --git a/erpnext/accounts/doctype/payment_terms_template_detail/__init__.py b/erpnext/accounts/doctype/payment_terms_template_detail/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json new file mode 100644 index 00000000000..88babd5020a --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json @@ -0,0 +1,229 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "PTTD.#####", + "beta": 0, + "creation": "2017-08-10 15:34:09.409562", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 2, + "fieldname": "payment_term", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payment Term", + "length": 0, + "no_copy": 0, + "options": "Payment Term", + "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": 2, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "options": "", + "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": 2, + "fieldname": "invoice_portion", + "fieldtype": "Percent", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Invoice Portion", + "length": 0, + "no_copy": 0, + "options": "", + "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": 2, + "fieldname": "due_date_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Due Date Based On", + "length": 0, + "no_copy": 0, + "options": "Day(s) after invoice date\nDay(s) after the end of the invoice month\nMonth(s) after the end of the invoice month", + "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": 2, + "depends_on": "eval:in_list(['Day(s) after invoice date', 'Day(s) after the end of the invoice month'], doc.due_date_based_on)", + "fieldname": "credit_days", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Credit Days", + "length": 0, + "no_copy": 0, + "options": "", + "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, + "depends_on": "eval:doc.due_date_based_on=='Month(s) after the end of the invoice month'", + "fieldname": "credit_months", + "fieldtype": "Int", + "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": "Credit Months", + "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2017-08-10 16:27:31.401380", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Payment Terms Template Detail", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py new file mode 100644 index 00000000000..1242cc1a08a --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, 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 PaymentTermsTemplateDetail(Document): + pass diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 7ab790118a0..bf620ab27ac 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -357,7 +357,27 @@ class PurchaseInvoice(BuyingController): return gl_entries def make_supplier_gl_entry(self, gl_entries): - if self.grand_total: + if self.get("payment_schedule"): + for d in self.get("payment_schedule"): + payment_amount_in_company_currency = flt(d.payment_amount * self.conversion_rate, + d.precision("payment_amount")) + + gl_entries.append( + self.get_gl_dict({ + "account": self.credit_to, + "party_type": "Supplier", + "party": self.supplier, + "due_date": d.due_date, + "against": self.against_expense_account, + "credit": payment_amount_in_company_currency, + "credit_in_account_currency": payment_amount_in_company_currency \ + if self.party_account_currency==self.company_currency else d.payment_amount, + "against_voucher": self.return_against if cint(self.is_return) else self.name, + "against_voucher_type": self.doctype + }, self.party_account_currency) + ) + + elif self.grand_total: # Didnot use base_grand_total to book rounding loss gle grand_total_in_company_currency = flt(self.grand_total * self.conversion_rate, self.precision("grand_total")) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 260c05e3e42..0af17335d86 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2685,6 +2685,101 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "eval:(!doc.is_pos && !doc.is_return)", + "columns": 0, + "fieldname": "payment_schedule_section", + "fieldtype": "Section 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, + "label": "Payment Schedule", + "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, + "depends_on": "eval:(!doc.is_pos && !doc.is_return)", + "fieldname": "payment_terms_template", + "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": "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, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:(!doc.is_pos && !doc.is_return)", + "fieldname": "payment_schedule", + "fieldtype": "Table", + "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": "Payment Schedule", + "length": 0, + "no_copy": 0, + "options": "Payment Schedule", + "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, @@ -2939,6 +3034,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "is_pos", "fieldname": "base_change_amount", "fieldtype": "Currency", "hidden": 0, @@ -2999,6 +3095,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "is_pos", "fieldname": "change_amount", "fieldtype": "Currency", "hidden": 0, @@ -3030,6 +3127,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "is_pos", "fieldname": "account_for_change_amount", "fieldtype": "Link", "hidden": 0, @@ -4688,7 +4786,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-07-07 13:05:37.469682", + "modified": "2017-08-10 18:02:44.286951", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 9dfacbdb5ec..4fbfc95d0fd 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe, erpnext import frappe.defaults -from frappe.utils import cint, flt +from frappe.utils import cint, flt, getdate from frappe import _, msgprint, throw from erpnext.accounts.party import get_party_account, get_due_date from erpnext.controllers.stock_controller import update_gl_entries_after @@ -99,6 +99,8 @@ class SalesInvoice(SellingController): self.set_billing_hours_and_amount() self.update_timesheet_billing_for_project() self.set_status() + self.set_payment_schedule() + self.validate_payment_schedule() def before_save(self): set_account_for_mode_of_payment(self) @@ -530,6 +532,31 @@ class SalesInvoice(SellingController): self.total_billing_amount = total_billing_amount + def set_payment_schedule(self): + if not self.get("payment_schedule"): + if self.due_date: + self.append("payment_schedule", { + "due_date": self.due_date, + "invoice_portion": 100, + "payment_amount": self.grand_total + }) + else: + self.due_date = max([d.due_date for d in self.get("payment_schedule")]) + + def validate_payment_schedule(self): + if self.due_date and getdate(self.due_date) < getdate(self.posting_date): + frappe.throw(_("Due Date cannot be before posting date")) + + total = 0 + for d in self.get("payment_schedule"): + if getdate(d.due_date) < getdate(self.posting_date): + frappe.throw(_("Row {0}: Due Date cannot be before posting date").format(d.idx)) + + total += flt(d.payment_amount) + + if total != self.grand_total: + frappe.throw(_("Total Payment Amount in Payment Schdule must be equal to Grand Total")) + def get_warehouse(self): user_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile` where ifnull(user,'') = %s and company = %s""", (frappe.session['user'], self.company)) @@ -619,7 +646,27 @@ class SalesInvoice(SellingController): return gl_entries def make_customer_gl_entry(self, gl_entries): - if self.grand_total: + if self.get("payment_schedule"): + for d in self.get("payment_schedule"): + payment_amount_in_company_currency = flt(d.payment_amount * self.conversion_rate, + d.precision("payment_amount")) + + gl_entries.append( + self.get_gl_dict({ + "account": self.debit_to, + "party_type": "Customer", + "party": self.customer, + "due_date": d.due_date, + "against": self.against_income_account, + "debit": payment_amount_in_company_currency, + "debit_in_account_currency": payment_amount_in_company_currency \ + if self.party_account_currency==self.company_currency else d.payment_amount, + "against_voucher": self.return_against if cint(self.is_return) else self.name, + "against_voucher_type": self.doctype + }, self.party_account_currency) + ) + + elif self.grand_total: # Didnot use base_grand_total to book rounding loss gle grand_total_in_company_currency = flt(self.grand_total * self.conversion_rate, self.precision("grand_total")) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js index 35b255875ea..f7a4488cd17 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js @@ -40,4 +40,3 @@ QUnit.test("test sales Invoice", function(assert) { () => done() ]); }); - diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 806b489da4e..bb4cab4817c 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe import unittest, copy -from frappe.utils import nowdate, add_days, flt +from frappe.utils import nowdate, add_days, flt, getdate from frappe.model.dynamic_links import get_dynamic_link_map from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry, get_qty_after_transaction from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import unlink_payment_on_cancel_of_invoice @@ -1271,6 +1271,38 @@ class TestSalesInvoice(unittest.TestCase): }) si.insert() return si + + def test_gl_entry_based_on_payment_schedule(self): + si = create_sales_invoice(do_not_save=True) + si.append("payment_schedule", { + "due_date": add_days(nowdate(), 15), + "payment_amount": 20 + }) + si.append("payment_schedule", { + "due_date": add_days(nowdate(), 45), + "payment_amount": 80 + }) + + si.save() + si.submit() + + gl_entries = frappe.db.sql("""select account, debit, credit, due_date + from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s + order by account asc, debit asc""", si.name, as_dict=1) + self.assertTrue(gl_entries) + + expected_gl_entries = sorted([ + [si.debit_to, 20.0, 0.0, add_days(nowdate(), 15)], + [si.debit_to, 80.0, 0.0, add_days(nowdate(), 45)], + ["Sales - _TC", 0.0, 100.0, None] + ]) + + for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)): + self.assertEquals(expected_gl_entries[i][0], gle.account) + self.assertEquals(expected_gl_entries[i][1], gle.debit) + self.assertEquals(expected_gl_entries[i][2], gle.credit) + self.assertEquals(getdate(expected_gl_entries[i][3]), getdate(gle.due_date)) + def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index ceae61cd869..45d2ef2fc63 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe, erpnext -from frappe.utils import flt, cstr, cint +from frappe.utils import flt, cstr, cint, getdate from frappe import _ from frappe.model.meta import get_field_precision from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget @@ -75,7 +75,8 @@ def check_if_in_list(gle, gl_map): and cstr(e.get('against_voucher'))==cstr(gle.get('against_voucher')) \ and cstr(e.get('against_voucher_type')) == cstr(gle.get('against_voucher_type')) \ and cstr(e.get('cost_center')) == cstr(gle.get('cost_center')) \ - and cstr(e.get('project')) == cstr(gle.get('project')): + and cstr(e.get('project')) == cstr(gle.get('project')) \ + and getdate(e.get('due_date')) == getdate(gle.get('due_date')): return e def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False): diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 9906893254f..b72a66972f4 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -113,7 +113,7 @@ class ReceivablePayableReport(object): row += [self.get_party_name(gle.party_type, gle.party)] # get due date - due_date = voucher_details.get(gle.voucher_no, {}).get("due_date", "") + due_date = gle.due_date or voucher_details.get(gle.voucher_no, {}).get("due_date", "") row += [gle.voucher_type, gle.voucher_no, due_date] @@ -162,8 +162,7 @@ class ReceivablePayableReport(object): def get_entries_till(self, report_date, party_type): # returns a generator - return (e for e in self.get_gl_entries(party_type) - if getdate(e.posting_date) <= report_date) + return (e for e in self.get_gl_entries(party_type) if getdate(e.posting_date) <= report_date) def is_receivable_or_payable(self, gle, dr_or_cr, future_vouchers): return ( @@ -189,7 +188,8 @@ class ReceivablePayableReport(object): reverse_dr_or_cr = "credit" if dr_or_cr=="debit" else "debit" for e in self.get_gl_entries_for(gle.party, gle.party_type, gle.voucher_type, gle.voucher_no): - if getdate(e.posting_date) <= report_date and e.name!=gle.name: + if getdate(e.posting_date) <= report_date and e.name!=gle.name \ + and (not gle.due_date or getdate(e.due_date) == getdate(gle.due_date)): amount = flt(e.get(reverse_dr_or_cr)) - flt(e.get(dr_or_cr)) if e.voucher_no not in return_entries: payment_amount += amount @@ -251,11 +251,11 @@ class ReceivablePayableReport(object): select_fields = "sum(debit) as debit, sum(credit) as credit" self.gl_entries = frappe.db.sql("""select name, posting_date, account, party_type, party, - voucher_type, voucher_no, against_voucher_type, against_voucher, + voucher_type, voucher_no, against_voucher_type, against_voucher, due_date, account_currency, remarks, {0} from `tabGL Entry` where docstatus < 2 and party_type=%s and (party is not null and party != '') {1} - group by voucher_type, voucher_no, against_voucher_type, against_voucher, party + group by voucher_type, voucher_no, against_voucher_type, against_voucher, party, due_date order by posting_date, party""" .format(select_fields, conditions), values, as_dict=True) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 66178022357..38258288a71 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -582,7 +582,7 @@ def get_outstanding_invoices(party_type, party, account, condition=None): invoice_list = frappe.db.sql(""" select - voucher_no, voucher_type, posting_date, ifnull(sum({dr_or_cr}), 0) as invoice_amount, + voucher_no, voucher_type, posting_date, ifnull(sum({dr_or_cr}), 0) as invoice_amount, due_date, ( select ifnull(sum({payment_dr_or_cr}), 0) from `tabGL Entry` payment_gl_entry @@ -591,6 +591,7 @@ def get_outstanding_invoices(party_type, party, account, condition=None): and payment_gl_entry.party_type = invoice_gl_entry.party_type and payment_gl_entry.party = invoice_gl_entry.party and payment_gl_entry.account = invoice_gl_entry.account + and payment_gl_entry.due_date = invoice_gl_entry.due_date and {payment_dr_or_cr} > 0 ) as payment_amount from @@ -602,9 +603,9 @@ def get_outstanding_invoices(party_type, party, account, condition=None): and ((voucher_type = 'Journal Entry' and (against_voucher = '' or against_voucher is null)) or (voucher_type not in ('Journal Entry', 'Payment Entry'))) - group by voucher_type, voucher_no + group by voucher_type, voucher_no, due_date having (invoice_amount - payment_amount) > 0.005 - order by posting_date, name""".format( + order by posting_date, name, due_date""".format( dr_or_cr = dr_or_cr, payment_dr_or_cr = payment_dr_or_cr, condition = condition or "" @@ -615,6 +616,7 @@ def get_outstanding_invoices(party_type, party, account, condition=None): }, as_dict=True) for d in invoice_list: + print d.voucher_no, d.invoice_amount, d.payment_amount outstanding_invoices.append(frappe._dict({ 'voucher_no': d.voucher_no, 'voucher_type': d.voucher_type, @@ -622,8 +624,8 @@ def get_outstanding_invoices(party_type, party, account, condition=None): 'invoice_amount': flt(d.invoice_amount), 'payment_amount': flt(d.payment_amount), 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision), - 'due_date': frappe.db.get_value(d.voucher_type, d.voucher_no, - "posting_date" if party_type=="Employee" else "due_date"), + 'due_date': d.due_date or (frappe.db.get_value(d.voucher_type, d.voucher_no, + "posting_date" if party_type=="Employee" else "due_date")), })) outstanding_invoices = sorted(outstanding_invoices, key=lambda k: k['due_date'] or getdate(nowdate())) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index b24e047bcc0..41f8dc5335d 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe, erpnext from frappe import _, throw -from frappe.utils import today, flt, cint, fmt_money, formatdate, getdate +from frappe.utils import today, flt, cint, fmt_money, formatdate, getdate, add_days, add_months, get_last_day from erpnext.setup.utils import get_exchange_rate from erpnext.accounts.utils import get_fiscal_years, validate_fiscal_year, get_account_currency from erpnext.utilities.transaction_base import TransactionBase @@ -782,4 +782,43 @@ def update_invoice_status(): where due_date < CURDATE() and docstatus = 1 and outstanding_amount > 0""") frappe.db.sql(""" update `tabPurchase Invoice` set status = 'Overdue' - where due_date < CURDATE() and docstatus = 1 and outstanding_amount > 0""") \ No newline at end of file + where due_date < CURDATE() and docstatus = 1 and outstanding_amount > 0""") + +@frappe.whitelist() +def get_payment_terms(terms_template, posting_date=None, grand_total=None): + if not terms_template: + return + + terms_doc = frappe.get_doc("Payment Terms Template", terms_template) + + schedule = [] + for i, d in enumerate(terms_doc.get("terms")): + term_details = get_payment_term_details(d, posting_date, grand_total) + schedule.append(term_details) + + return schedule + +@frappe.whitelist() +def get_payment_term_details(term, posting_date=None, grand_total=None): + term_details = frappe._dict() + if isinstance(term, unicode): + term = frappe.get_doc("Payment Term", term) + else: + term_details.payment_term = term.payment_term + term_details.description = term.description + term_details.invoice_portion = term.invoice_portion + term_details.payment_amount = flt(term.invoice_portion) * flt(grand_total) / 100 + if posting_date: + term_details.due_date = get_due_date(posting_date, term) + return term_details + +def get_due_date(posting_date, term): + due_date = None + if term.due_date_based_on == "Day(s) after invoice date": + due_date = add_days(posting_date, term.credit_days) + elif term.due_date_based_on == "Day(s) after the end of the invoice month": + due_date = add_days(get_last_day(posting_date), term.credit_days) + elif term.due_date_based_on == "Month(s) after the end of the invoice month": + due_date = add_months(get_last_day(posting_date), term.credit_months) + + return due_date \ No newline at end of file diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 3a8ddb59278..f72a9299da2 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1100,6 +1100,46 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ } } }, + + payment_terms_template: function() { + var me = this; + if(this.frm.doc.payment_terms_template) { + frappe.call({ + method: "erpnext.controllers.accounts_controller.get_payment_terms", + args: { + terms_template: this.frm.doc.payment_terms_template, + posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date, + grand_total: this.frm.doc.grand_total + }, + callback: function(r) { + if(r.message && !r.exc) { + me.frm.set_value("payment_schedule", r.message); + } + } + }) + } + }, + + payment_term: function(doc, cdt, cdn) { + var row = locals[cdt][cdn]; + if(row.payment_term) { + frappe.call({ + method: "erpnext.controllers.accounts_controller.get_payment_term_details", + args: { + term: row.payment_term, + posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date, + grand_total: this.frm.doc.grand_total + }, + callback: function(r) { + if(r.message && !r.exc) { + for (var d in r.message) { + frappe.model.set_value(cdt, cdn, d, r.message[d]); + } + } + } + }) + } + } }); erpnext.show_serial_batch_selector = function(frm, d) { From bc174d980c66b6b59fed14f2ebc3a3f78c6a0f8e Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 16 Aug 2017 15:34:06 +0100 Subject: [PATCH 002/164] add Payment Term to Quotation --- .../selling/doctype/quotation/quotation.json | 96 ++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 0afc5ca3d07..bd9814b54b9 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2089,6 +2089,100 @@ "unique": 0, "width": "200px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "eval:!doc.__islocal", + "columns": 0, + "depends_on": "", + "fieldname": "payment_schedule_section", + "fieldtype": "Section 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, + "label": "Payment Schedule", + "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, + "fieldname": "payment_terms_template", + "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": "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, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payment_schedule", + "fieldtype": "Table", + "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": "Payment Schedule", + "length": 0, + "no_copy": 0, + "options": "Payment Schedule", + "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, @@ -2633,7 +2727,7 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-08-09 06:35:48.691648", + "modified": "2017-08-16 15:31:23.079739", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", From 9df5e004cf98000f0e1f61f28c1030360e9e6a40 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 16 Aug 2017 16:03:15 +0100 Subject: [PATCH 003/164] add Payment Terms to Sales Order --- .../doctype/sales_order/sales_order.json | 98 ++++++++++++++++++- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index b69b3fda77b..94d33f0fb5d 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2255,10 +2255,9 @@ "label": "Packed Items", "length": 0, "no_copy": 0, - "oldfieldname": "packing_details", - "oldfieldtype": "Table", "options": "Packed Item", "permlevel": 0, + "precision": "", "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 1, @@ -2269,6 +2268,99 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "eval:!doc.__islocal||doc.payment_schedule", + "columns": 0, + "fieldname": "payment_schedule_section", + "fieldtype": "Section 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, + "label": "Payment Terms Schedule", + "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, + "fieldname": "payment_terms_template", + "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": "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, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payment_schedule", + "fieldtype": "Table", + "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": "Payment Schedule", + "length": 0, + "no_copy": 0, + "options": "Payment Schedule", + "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, @@ -3659,7 +3751,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-07 21:27:10.073581", + "modified": "2017-08-16 16:00:08.404180", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", From b76ab49edea26a2016d688cbe1ae5e47ce28ad37 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 16 Aug 2017 17:02:45 +0100 Subject: [PATCH 004/164] add Payment Term to Purchase Order --- .../purchase_order/purchase_order.json | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 09c987f0fd8..16b12eac749 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2288,6 +2288,98 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "payment_schedule_section", + "fieldtype": "Section 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, + "label": "Payment Terms Schedule", + "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, + "fieldname": "payment_terms_template", + "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": "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, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payment_schedule", + "fieldtype": "Table", + "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": "Payment Schedule", + "length": 0, + "no_copy": 0, + "options": "Payment Schedule", + "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, @@ -3335,7 +3427,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-07-19 14:03:51.838328", + "modified": "2017-08-16 16:57:51.320375", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", From 20c041cea4a549c448f3a88b2a80caf2d679061d Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 16 Aug 2017 17:11:30 +0100 Subject: [PATCH 005/164] add Payment Term to Purchase Invoice --- .../purchase_invoice/purchase_invoice.json | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 8ea48f65aa8..691ee45b3a7 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2726,6 +2726,98 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "payment_schedule_section", + "fieldtype": "Section 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, + "label": "Payment Terms Schedule", + "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, + "fieldname": "payment_terms_template", + "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": "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, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "payment_schedule", + "fieldtype": "Table", + "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": "Payment Schedule", + "length": 0, + "no_copy": 0, + "options": "Payment Schedule", + "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, @@ -3797,7 +3889,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-07-19 13:53:48.673757", + "modified": "2017-08-16 17:10:30.248741", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", From 43870aa8dbf8e92c45a9269ddc9906210d4213eb Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 18 Aug 2017 11:59:30 +0100 Subject: [PATCH 006/164] moves `set_payment_schedule` and `validate_payment_schedule` to accounts_controller --- .../doctype/sales_invoice/sales_invoice.py | 27 ----------------- erpnext/controllers/accounts_controller.py | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 4fbfc95d0fd..bc3531778d1 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -99,8 +99,6 @@ class SalesInvoice(SellingController): self.set_billing_hours_and_amount() self.update_timesheet_billing_for_project() self.set_status() - self.set_payment_schedule() - self.validate_payment_schedule() def before_save(self): set_account_for_mode_of_payment(self) @@ -532,31 +530,6 @@ class SalesInvoice(SellingController): self.total_billing_amount = total_billing_amount - def set_payment_schedule(self): - if not self.get("payment_schedule"): - if self.due_date: - self.append("payment_schedule", { - "due_date": self.due_date, - "invoice_portion": 100, - "payment_amount": self.grand_total - }) - else: - self.due_date = max([d.due_date for d in self.get("payment_schedule")]) - - def validate_payment_schedule(self): - if self.due_date and getdate(self.due_date) < getdate(self.posting_date): - frappe.throw(_("Due Date cannot be before posting date")) - - total = 0 - for d in self.get("payment_schedule"): - if getdate(d.due_date) < getdate(self.posting_date): - frappe.throw(_("Row {0}: Due Date cannot be before posting date").format(d.idx)) - - total += flt(d.payment_amount) - - if total != self.grand_total: - frappe.throw(_("Total Payment Amount in Payment Schdule must be equal to Grand Total")) - def get_warehouse(self): user_pos_profile = frappe.db.sql("""select name, warehouse from `tabPOS Profile` where ifnull(user,'') = %s and company = %s""", (frappe.session['user'], self.company)) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 41f8dc5335d..bb634d1e0e1 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -44,6 +44,8 @@ class AccountsController(TransactionBase): self.set_total_in_words() if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return: + self.set_payment_schedule() + self.validate_payment_schedule() self.validate_due_date() self.validate_advance_entries() @@ -614,6 +616,33 @@ class AccountsController(TransactionBase): for item in duplicate_list: self.remove(item) + def set_payment_schedule(self): + if not self.get("payment_schedule"): + if self.due_date: + self.append("payment_schedule", { + "due_date": self.due_date, + "invoice_portion": 100, + "payment_amount": self.grand_total + }) + else: + self.due_date = max([d.due_date for d in self.get("payment_schedule")]) + + def validate_payment_schedule(self): + if self.due_date and getdate(self.due_date) < getdate(self.posting_date): + frappe.throw(_("Due Date cannot be before posting date")) + + total = 0 + for d in self.get("payment_schedule"): + if getdate(d.due_date) < getdate(self.posting_date): + frappe.throw(_("Row {0}: Due Date cannot be before posting date").format(d.idx)) + + total += flt(d.payment_amount) + + if total != self.grand_total: + frappe.throw(_("Total Payment Amount in Payment Schdule must be equal to Grand Total")) + + + @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, ["tax_rate", "account_name"], as_dict=True) From 4c5efa3dec775dc90f71ea872c14eb41b90b57a1 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 18 Aug 2017 21:29:23 +0100 Subject: [PATCH 007/164] renames `set_payment_schedule` and removes it from validation --- erpnext/controllers/accounts_controller.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index bb634d1e0e1..346c4aaa6c7 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -44,7 +44,6 @@ class AccountsController(TransactionBase): self.set_total_in_words() if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return: - self.set_payment_schedule() self.validate_payment_schedule() self.validate_due_date() self.validate_advance_entries() @@ -616,7 +615,7 @@ class AccountsController(TransactionBase): for item in duplicate_list: self.remove(item) - def set_payment_schedule(self): + def _set_payment_schedule(self): if not self.get("payment_schedule"): if self.due_date: self.append("payment_schedule", { From be1b871c534a3089753bdc0ec428183bacea17a2 Mon Sep 17 00:00:00 2001 From: tunde Date: Sat, 19 Aug 2017 08:21:44 +0100 Subject: [PATCH 008/164] modify validation if doc has payment term schedule --- erpnext/controllers/accounts_controller.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 346c4aaa6c7..c5390ffe47e 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -44,7 +44,9 @@ class AccountsController(TransactionBase): self.set_total_in_words() if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return: - self.validate_payment_schedule() + if self.get("payment_schedule"): + self.set_due_date() + self.validate_payment_schedule() self.validate_due_date() self.validate_advance_entries() @@ -626,6 +628,9 @@ class AccountsController(TransactionBase): else: self.due_date = max([d.due_date for d in self.get("payment_schedule")]) + def set_due_date(self): + self.due_date = max([d.due_date for d in self.get("payment_schedule")]) + def validate_payment_schedule(self): if self.due_date and getdate(self.due_date) < getdate(self.posting_date): frappe.throw(_("Due Date cannot be before posting date")) @@ -641,7 +646,6 @@ class AccountsController(TransactionBase): frappe.throw(_("Total Payment Amount in Payment Schdule must be equal to Grand Total")) - @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, ["tax_rate", "account_name"], as_dict=True) From c7f46218d724751af26fb05312047c2b755c3479 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 18 Aug 2017 13:25:02 +0100 Subject: [PATCH 009/164] tests and test fixes fixes test case: make sales invoice using customer that does not have credit_days_based_on 'Last Day Of Next Month' so that it doesn't conflict with payment term due date fix test case: create purchase invoice with new supplier with credit_days_based_on "Fixed Days" as the default "Last Day of Month" does not apply when using payment terms --- .../purchase_invoice/test_purchase_invoice.py | 34 ++++++++++++++++++- .../sales_invoice/test_sales_invoice.py | 4 +-- .../buying/doctype/supplier/test_records.json | 6 ++++ .../doctype/customer/test_records.json | 8 +++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 3454a2e9b49..f189bf849af 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import unittest import frappe, erpnext import frappe.model -from frappe.utils import cint, flt, today, nowdate +from frappe.utils import cint, flt, today, nowdate, getdate, add_days import frappe.defaults from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory, \ test_records as pr_test_records @@ -551,6 +551,38 @@ class TestPurchaseInvoice(unittest.TestCase): #check outstanding after advance cancellation self.assertEqual(flt(pi.outstanding_amount), flt(pi.grand_total + pi.total_advance)) + def test_gl_entry_based_on_payment_schedule(self): + pi = make_purchase_invoice(do_not_save=True, supplier="_Test Supplier P") + pi.append("payment_schedule", { + "due_date": add_days(nowdate(), 15), + "payment_amount": 100 + }) + pi.append("payment_schedule", { + "due_date": add_days(nowdate(), 45), + "payment_amount": 150 + }) + + pi.save() + pi.submit() + + gl_entries = frappe.db.sql("""select account, debit, credit, due_date + from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s + order by account asc, debit asc""", pi.name, as_dict=1) + self.assertTrue(gl_entries) + + expected_gl_entries = sorted([ + [pi.credit_to, 0.0, 100.0, add_days(nowdate(), 15)], + [pi.credit_to, 0.0, 150.0, add_days(nowdate(), 45)], + ["_Test Account Cost for Goods Sold - _TC", 250.0, 0.0, None] + ]) + + for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)): + self.assertEquals(expected_gl_entries[i][0], gle.account) + self.assertEquals(expected_gl_entries[i][1], gle.debit) + self.assertEquals(expected_gl_entries[i][2], gle.credit) + self.assertEquals(getdate(expected_gl_entries[i][3]), getdate(gle.due_date)) + + def unlink_payment_on_cancel_of_invoice(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") accounts_settings.unlink_payment_on_cancellation_of_invoice = enable diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index bb4cab4817c..331aee9e9b3 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1273,7 +1273,7 @@ class TestSalesInvoice(unittest.TestCase): return si def test_gl_entry_based_on_payment_schedule(self): - si = create_sales_invoice(do_not_save=True) + si = create_sales_invoice(do_not_save=True, customer="_Test Customer P") si.append("payment_schedule", { "due_date": add_days(nowdate(), 15), "payment_amount": 20 @@ -1302,7 +1302,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(expected_gl_entries[i][1], gle.debit) self.assertEquals(expected_gl_entries[i][2], gle.credit) self.assertEquals(getdate(expected_gl_entries[i][3]), getdate(gle.due_date)) - + def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json index d2b399544f9..fa728bed114 100644 --- a/erpnext/buying/doctype/supplier/test_records.json +++ b/erpnext/buying/doctype/supplier/test_records.json @@ -1,4 +1,10 @@ [ + { + "doctype": "Supplier", + "supplier_name": "_Test Supplier P", + "supplier_type": "_Test Supplier Type", + "credit_days_based_on": "Fixed Days" + }, { "doctype": "Supplier", "supplier_name": "_Test Supplier with Country", diff --git a/erpnext/selling/doctype/customer/test_records.json b/erpnext/selling/doctype/customer/test_records.json index 94f14ed6fb0..43d6beb0cbf 100644 --- a/erpnext/selling/doctype/customer/test_records.json +++ b/erpnext/selling/doctype/customer/test_records.json @@ -1,4 +1,12 @@ [ + { + "customer_group": "_Test Customer Group", + "customer_name": "_Test Customer P", + "customer_type": "Individual", + "doctype": "Customer", + "territory": "_Test Territory", + "credit_days_based_on": "Fixed Days" + }, { "customer_group": "_Test Customer Group", "customer_name": "_Test Customer", From fb144303f5bad990431d827521aeb00ffb2ad884 Mon Sep 17 00:00:00 2001 From: tunde Date: Sat, 19 Aug 2017 15:01:40 +0100 Subject: [PATCH 010/164] codacy and typo fixes --- erpnext/accounts/doctype/payment_entry/payment_entry.py | 2 +- .../accounts/doctype/payment_schedule/payment_schedule.py | 2 +- erpnext/accounts/doctype/payment_term/payment_term.js | 6 ------ erpnext/accounts/doctype/payment_term/payment_term.py | 2 +- erpnext/accounts/doctype/payment_term/test_payment_term.py | 3 +-- .../payment_terms_template/payment_terms_template.py | 2 +- .../payment_terms_template/test_payment_terms_template.py | 3 +-- .../payment_terms_template_detail.py | 2 +- erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py | 1 + erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 2 +- erpnext/accounts/utils.py | 6 +++--- erpnext/controllers/accounts_controller.py | 4 ++-- 12 files changed, 14 insertions(+), 21 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 9534f514c1f..762fa994632 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -779,7 +779,7 @@ def get_paid_amount(dt, dn, party_type, party, account, due_date): dr_or_cr = "credit_in_account_currency - debit_in_account_currency" else: dr_or_cr = "debit_in_account_currency - credit_in_account_currency" - + paid_amount = frappe.db.sql(""" select ifnull(sum({dr_or_cr}), 0) as paid_amount from `tabGL Entry` diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.py b/erpnext/accounts/doctype/payment_schedule/payment_schedule.py index 75bacc64067..41740170f03 100644 --- a/erpnext/accounts/doctype/payment_schedule/payment_schedule.py +++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.py @@ -3,8 +3,8 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document + class PaymentSchedule(Document): pass diff --git a/erpnext/accounts/doctype/payment_term/payment_term.js b/erpnext/accounts/doctype/payment_term/payment_term.js index 564a2a6d3be..054c2d11917 100644 --- a/erpnext/accounts/doctype/payment_term/payment_term.js +++ b/erpnext/accounts/doctype/payment_term/payment_term.js @@ -1,8 +1,2 @@ // Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt - -frappe.ui.form.on('Payment Term', { - refresh: function(frm) { - - } -}); diff --git a/erpnext/accounts/doctype/payment_term/payment_term.py b/erpnext/accounts/doctype/payment_term/payment_term.py index 93a7529a113..5d4df053fb2 100644 --- a/erpnext/accounts/doctype/payment_term/payment_term.py +++ b/erpnext/accounts/doctype/payment_term/payment_term.py @@ -3,8 +3,8 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document + class PaymentTerm(Document): pass diff --git a/erpnext/accounts/doctype/payment_term/test_payment_term.py b/erpnext/accounts/doctype/payment_term/test_payment_term.py index c4d5d375942..d9baa5907b9 100644 --- a/erpnext/accounts/doctype/payment_term/test_payment_term.py +++ b/erpnext/accounts/doctype/payment_term/test_payment_term.py @@ -2,9 +2,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt from __future__ import unicode_literals - -import frappe import unittest + class TestPaymentTerm(unittest.TestCase): pass diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py index 3300a1122c8..d2344d6c77b 100644 --- a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py @@ -3,8 +3,8 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document + class PaymentTermsTemplate(Document): pass diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py index 33d256c58ac..ec370668a0e 100644 --- a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py @@ -2,9 +2,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt from __future__ import unicode_literals - -import frappe import unittest + class TestPaymentTermsTemplate(unittest.TestCase): pass diff --git a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py index 1242cc1a08a..54c0fda0119 100644 --- a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py +++ b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.py @@ -3,8 +3,8 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document + class PaymentTermsTemplateDetail(Document): pass diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index 82a3d653abf..9ec69c32c71 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -252,6 +252,7 @@ class TestPricingRule(unittest.TestCase): self.assertEquals(so.items[0].rate, 100) def test_pricing_rule_with_margin_and_discount(self): + frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule') make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10) si = create_sales_invoice(do_not_save=True) si.items[0].price_list_rate = 1000 diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index bc3531778d1..8c57cab83bf 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe, erpnext import frappe.defaults -from frappe.utils import cint, flt, getdate +from frappe.utils import cint, flt from frappe import _, msgprint, throw from erpnext.accounts.party import get_party_account, get_due_date from erpnext.controllers.stock_controller import update_gl_entries_after diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 38258288a71..00d52d1a1cc 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -616,7 +616,8 @@ def get_outstanding_invoices(party_type, party, account, condition=None): }, as_dict=True) for d in invoice_list: - print d.voucher_no, d.invoice_amount, d.payment_amount + due_date = d.due_date or (frappe.db.get_value(d.voucher_type, d.voucher_no, + "posting_date" if party_type=="Employee" else "due_date")) outstanding_invoices.append(frappe._dict({ 'voucher_no': d.voucher_no, 'voucher_type': d.voucher_type, @@ -624,8 +625,7 @@ def get_outstanding_invoices(party_type, party, account, condition=None): 'invoice_amount': flt(d.invoice_amount), 'payment_amount': flt(d.payment_amount), 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision), - 'due_date': d.due_date or (frappe.db.get_value(d.voucher_type, d.voucher_no, - "posting_date" if party_type=="Employee" else "due_date")), + 'due_date': due_date })) outstanding_invoices = sorted(outstanding_invoices, key=lambda k: k['due_date'] or getdate(nowdate())) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index c5390ffe47e..25ec8637f53 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -643,7 +643,7 @@ class AccountsController(TransactionBase): total += flt(d.payment_amount) if total != self.grand_total: - frappe.throw(_("Total Payment Amount in Payment Schdule must be equal to Grand Total")) + frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) @frappe.whitelist() @@ -824,7 +824,7 @@ def get_payment_terms(terms_template, posting_date=None, grand_total=None): terms_doc = frappe.get_doc("Payment Terms Template", terms_template) schedule = [] - for i, d in enumerate(terms_doc.get("terms")): + for d in terms_doc.get("terms"): term_details = get_payment_term_details(d, posting_date, grand_total) schedule.append(term_details) From f7e87e66eede8519475dfead1eaaa7a4182ee86e Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 23 Aug 2017 22:36:25 +0100 Subject: [PATCH 011/164] do correct gl entry for debit and credit notes --- erpnext/controllers/sales_and_purchase_return.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 00745601845..d609b9e02b5 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -256,6 +256,9 @@ def make_return_doc(doctype, source_name, target_doc=None): target_doc.dn_detail = source_doc.dn_detail target_doc.expense_account = source_doc.expense_account + def update_terms(source_doc, target_doc, source_parent): + target_doc.payment_amount = -source_doc.payment_amount + doclist = get_mapped_doc(doctype, source_name, { doctype: { "doctype": doctype, @@ -272,6 +275,10 @@ def make_return_doc(doctype, source_name, target_doc=None): }, "postprocess": update_item }, + "Payment Schedule": { + "doctype": "Payment Schedule", + "postprocess": update_terms + } }, target_doc, set_missing_values) return doclist From 6b2d9e4990b3d2468a85d361d464844bb330b313 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 25 Aug 2017 15:18:36 +0100 Subject: [PATCH 012/164] patch to add due date to GL Entries for Sales/Purchase invoice --- erpnext/patches.txt | 3 +- .../v8_8/update_gl_due_date_for_pi_and_si.py | 88 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index d781ec788f5..f7a6abbb5b3 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -432,4 +432,5 @@ erpnext.patches.v8_5.update_customer_group_in_POS_profile erpnext.patches.v8_6.update_timesheet_company_from_PO erpnext.patches.v8_6.set_write_permission_for_quotation_for_sales_manager erpnext.patches.v8_5.remove_project_type_property_setter -erpnext.patches.v8_7.add_more_gst_fields \ No newline at end of file +erpnext.patches.v8_7.add_more_gst_fields +erpnext.patches.v8_8.update_gl_due_date_for_pi_and_si \ No newline at end of file diff --git a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py new file mode 100644 index 00000000000..48da3ea95e5 --- /dev/null +++ b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py @@ -0,0 +1,88 @@ +from __future__ import unicode_literals +import frappe + +""" +This will update existing GL Entries by saving its linked Purchase/Sales Invoice's +due date as the due date for the GL Entry +""" + + +def execute(): + pi_kwargs = dict( + voucher_type='Purchase Invoice', doctype='GL Entry', fields=['voucher_no'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Purchase Invoice', 'debit': ('!=', '0') + } + ) + si_kwargs = dict( + voucher_type='Sales Invoice', doctype='GL Entry', fields=['voucher_no'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Sales Invoice', 'credit': ('!=', '0') + } + ) + kwargs = [pi_kwargs, si_kwargs] + + for kwarg in kwargs: + for batch in get_result_in_batches(**kwarg): + conditions, names = build_conditions(batch, kwarg.get('voucher_type')) + if conditions and names: + start = 'UPDATE `tabGL Entry` SET `due_date` = CASE ' + cond = ' '.join(conditions) + frappe.db.sql( + start + cond + ' ELSE `due_date` END WHERE `voucher_no` IN %s', + values=(names,) + ) + + +def get_result_in_batches(**kwargs): + """A simple generator to yield slices of GL Entry records""" + while True: + batch = get_gle_batch(**kwargs) + if batch: + yield batch + else: + return + + +def get_gle_batch(**kwargs): + """Returns a slice of records in GL Entry""" + doctype = kwargs.get('doctype') + fields = kwargs.get('fields') + limit_start = kwargs.get('limit_start') + limit_page_length = kwargs.get('limit_page_length') + filters = kwargs.get('filters') + + results = frappe.get_list( + doctype, fields=fields, limit_start=limit_start, limit_page_length=limit_page_length, + filters=filters + ) + + return results + + +def build_conditions(query_results, voucher_type): + """ + builds the string to be used is sql CASE statement. Returns the a tuple of + the string for the CASE statement and a tuple of applicable voucher names + """ + conditions = [] + invoice_names = [] + + # first extract the voucher names into two separate lists so it can be easy to query the db + for result in query_results: + voucher_no = result.get('voucher_no') + if voucher_no: + invoice_names.append("%s" % (voucher_no,)) + + # get invoice details + invoice_details = frappe.get_list( + voucher_type, fields=['name', 'due_date'], filters={'name': ('in', invoice_names)} + ) + + if invoice_details: + for d in invoice_details: + conditions.append('WHEN `voucher_no`="{number}" THEN "{date}"'.format(number=d.name, date=d.due_date)) + + return conditions, invoice_names From 63c8cb2fd1cd3fed5fed2b60298b2c26d1252648 Mon Sep 17 00:00:00 2001 From: tunde Date: Sun, 27 Aug 2017 17:56:47 +0100 Subject: [PATCH 013/164] add due_date to Journal Entry Account doctype --- .../journal_entry_account.json | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json index 54af579adb4..6d95ac30c10 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "hash", @@ -13,6 +14,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -46,6 +48,7 @@ "width": "250px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -75,6 +78,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -106,6 +110,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -141,6 +146,7 @@ "width": "180px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -168,6 +174,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -197,6 +204,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -226,6 +234,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -256,6 +265,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -287,6 +297,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -317,6 +328,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -345,6 +357,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -374,6 +387,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -402,6 +416,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -432,6 +447,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -464,6 +480,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -491,6 +508,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -521,6 +539,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -553,6 +572,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -581,6 +601,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -611,6 +632,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -641,6 +663,38 @@ "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.reference_type&&!in_list(doc.reference_type, ['Expense Claim', 'Asset', 'Employee Loan'])", + "fieldname": "due_date", + "fieldtype": "Date", + "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": "Reference Due Date", + "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, @@ -671,6 +725,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -698,6 +753,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -729,6 +785,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -759,17 +816,17 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-03-02 05:02:10.102039", + "modified": "2017-08-27 17:50:58.793144", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From 3b327ed55f76bd6ce9401693976ef8b546fc27c2 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 29 Aug 2017 10:23:19 +0100 Subject: [PATCH 014/164] 'modify patch to also adjust journal entries' --- .../v8_8/update_gl_due_date_for_pi_and_si.py | 75 +++++++++++++------ 1 file changed, 52 insertions(+), 23 deletions(-) diff --git a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py index 48da3ea95e5..636da6974e2 100644 --- a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py +++ b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py @@ -3,35 +3,25 @@ import frappe """ This will update existing GL Entries by saving its linked Purchase/Sales Invoice's -due date as the due date for the GL Entry +and Journal Entry's due date as the due date for the GL Entry """ def execute(): - pi_kwargs = dict( - voucher_type='Purchase Invoice', doctype='GL Entry', fields=['voucher_no'], - limit_start=0, limit_page_length=5, filters={ - "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), - 'voucher_type': 'Purchase Invoice', 'debit': ('!=', '0') - } - ) - si_kwargs = dict( - voucher_type='Sales Invoice', doctype='GL Entry', fields=['voucher_no'], - limit_start=0, limit_page_length=5, filters={ - "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), - 'voucher_type': 'Sales Invoice', 'credit': ('!=', '0') - } - ) - kwargs = [pi_kwargs, si_kwargs] + kwargs = get_query_kwargs() for kwarg in kwargs: for batch in get_result_in_batches(**kwarg): - conditions, names = build_conditions(batch, kwarg.get('voucher_type')) + voucher_num_col = kwarg.get('voucher_num_col', 'voucher_no') + voucher_type = kwarg.get('use_voucher_type') or kwarg.get('voucher_type') + conditions, names = build_conditions(batch, voucher_type, voucher_num_col) if conditions and names: start = 'UPDATE `tabGL Entry` SET `due_date` = CASE ' cond = ' '.join(conditions) + else_cond = ' ELSE `due_date` END WHERE ' + frappe.db.sql( - start + cond + ' ELSE `due_date` END WHERE `voucher_no` IN %s', + start + cond + else_cond + voucher_num_col + ' IN %s', values=(names,) ) @@ -53,16 +43,17 @@ def get_gle_batch(**kwargs): limit_start = kwargs.get('limit_start') limit_page_length = kwargs.get('limit_page_length') filters = kwargs.get('filters') + or_filters = kwargs.get('or_filters') results = frappe.get_list( doctype, fields=fields, limit_start=limit_start, limit_page_length=limit_page_length, - filters=filters + filters=filters, or_filters=or_filters ) return results -def build_conditions(query_results, voucher_type): +def build_conditions(query_results, voucher_type, voucher_num_col): """ builds the string to be used is sql CASE statement. Returns the a tuple of the string for the CASE statement and a tuple of applicable voucher names @@ -70,9 +61,8 @@ def build_conditions(query_results, voucher_type): conditions = [] invoice_names = [] - # first extract the voucher names into two separate lists so it can be easy to query the db for result in query_results: - voucher_no = result.get('voucher_no') + voucher_no = result.get(voucher_num_col) if voucher_no: invoice_names.append("%s" % (voucher_no,)) @@ -83,6 +73,45 @@ def build_conditions(query_results, voucher_type): if invoice_details: for d in invoice_details: - conditions.append('WHEN `voucher_no`="{number}" THEN "{date}"'.format(number=d.name, date=d.due_date)) + conditions.append('WHEN `{voucher_no}`="{number}" THEN "{date}"'.format( + number=d.name, date=d.due_date, voucher_no=voucher_num_col)) return conditions, invoice_names + + +def get_query_kwargs(): + pi_kwargs = dict( + voucher_type='Purchase Invoice', doctype='GL Entry', fields=['voucher_no'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Purchase Invoice', 'debit': ('!=', '0') + } + ) + + si_kwargs = dict( + voucher_type='Sales Invoice', doctype='GL Entry', fields=['voucher_no'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Sales Invoice', 'credit': ('!=', '0') + } + ) + + journal_kwargs_si = dict( + voucher_type='Journal Entry', doctype='GL Entry', fields=['against_voucher'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Journal Entry', 'against_voucher_type': 'Sales Invoice' + }, + voucher_num_col='against_voucher', use_voucher_type='Sales Invoice', + ) + + journal_kwargs_pi = dict( + voucher_type='Journal Entry', doctype='GL Entry', fields=['against_voucher'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Journal Entry', 'against_voucher_type': 'Purchase Invoice' + }, + voucher_num_col='against_voucher', use_voucher_type='Purchase Invoice', + ) + + return [pi_kwargs, si_kwargs, journal_kwargs_pi, journal_kwargs_si] From 7555a4a13e24009e196c546c07c6abe666a66926 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 29 Aug 2017 13:40:16 +0100 Subject: [PATCH 015/164] fix patch and also patch payment entries --- .../v8_8/update_gl_due_date_for_pi_and_si.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py index 636da6974e2..1e0ca6a9185 100644 --- a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py +++ b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py @@ -84,7 +84,7 @@ def get_query_kwargs(): voucher_type='Purchase Invoice', doctype='GL Entry', fields=['voucher_no'], limit_start=0, limit_page_length=5, filters={ "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), - 'voucher_type': 'Purchase Invoice', 'debit': ('!=', '0') + 'voucher_type': 'Purchase Invoice', 'credit': ('!=', '0') } ) @@ -92,7 +92,7 @@ def get_query_kwargs(): voucher_type='Sales Invoice', doctype='GL Entry', fields=['voucher_no'], limit_start=0, limit_page_length=5, filters={ "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), - 'voucher_type': 'Sales Invoice', 'credit': ('!=', '0') + 'voucher_type': 'Sales Invoice', 'debit': ('!=', '0') } ) @@ -114,4 +114,25 @@ def get_query_kwargs(): voucher_num_col='against_voucher', use_voucher_type='Purchase Invoice', ) - return [pi_kwargs, si_kwargs, journal_kwargs_pi, journal_kwargs_si] + payment_entry_kwargs_pi = dict( + voucher_type='Payment Entry', doctype='GL Entry', fields=['against_voucher'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Payment Entry', 'against_voucher_type': 'Purchase Invoice' + }, + voucher_num_col='against_voucher', use_voucher_type='Purchase Invoice', + ) + + payment_entry_kwargs_si = dict( + voucher_type='Payment Entry', doctype='GL Entry', fields=['against_voucher'], + limit_start=0, limit_page_length=5, filters={ + "ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''), + 'voucher_type': 'Payment Entry', 'against_voucher_type': 'Sales Invoice' + }, + voucher_num_col='against_voucher', use_voucher_type='Sales Invoice', + ) + + return [ + pi_kwargs, si_kwargs, journal_kwargs_pi, journal_kwargs_si, + payment_entry_kwargs_pi, payment_entry_kwargs_si + ] From 2883662ccb579372ed4ee718bb76a021507afec9 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 29 Aug 2017 21:04:46 +0100 Subject: [PATCH 016/164] change `due_date` to `reference_due_date` in Journal Entry Account --- .../journal_entry_account/journal_entry_account.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json index 6d95ac30c10..48d5ed2ca9e 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -669,8 +669,8 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.reference_type&&!in_list(doc.reference_type, ['Expense Claim', 'Asset', 'Employee Loan'])", - "fieldname": "due_date", - "fieldtype": "Date", + "fieldname": "reference_due_date", + "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -681,6 +681,7 @@ "label": "Reference Due Date", "length": 0, "no_copy": 0, + "options": "", "permlevel": 0, "precision": "", "print_hide": 0, @@ -826,7 +827,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-08-27 17:50:58.793144", + "modified": "2017-08-30 08:44:54.295493", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", From 08d8ca0184f19dab13ca77d930baf0dc2db5087e Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 30 Aug 2017 13:41:07 +0100 Subject: [PATCH 017/164] enhance reference_due_date behaviour: - creates new api - get_invoice_due_dates - when reference_name is changed, populate reference_due_date --- .../doctype/journal_entry/journal_entry.js | 21 +++++++++++++++++++ .../doctype/journal_entry/journal_entry.py | 11 ++++++++++ 2 files changed, 32 insertions(+) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 9047a4edccf..934dbeb03a0 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -187,6 +187,24 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ reference_name: function(doc, cdt, cdn) { var d = frappe.get_doc(cdt, cdn); + + const get_invoice_due_dates = (invoice_name) => { + frappe.call({ + method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_invoice_due_dates", + args: {name: invoice_name}, + callback: function(r){ + const wrapper = cur_frm.fields_dict["accounts"].wrapper; + const input = $(wrapper).find("select[data-fieldname=reference_due_date]"); + + input.children('option').remove(); + + $.each(r.message, function(key, value) { + input.append(new Option(value.due_date, "", false, false)); + }); + } + }); + } + if(d.reference_name) { if (d.reference_type==="Purchase Invoice" && !flt(d.debit)) { this.get_outstanding('Purchase Invoice', d.reference_name, doc.company, d); @@ -197,6 +215,9 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ if (d.reference_type==="Journal Entry" && !flt(d.credit) && !flt(d.debit)) { this.get_outstanding('Journal Entry', d.reference_name, doc.company, d); } + if( in_list(d.reference_type), ["Sales Invoice", "Purchase Invoice"]) { + get_invoice_due_dates(d.reference_name); + } } }, diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 375d85d1b72..68f4cc53bee 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -889,3 +889,14 @@ def get_average_exchange_rate(account): exchange_rate = bank_balance_in_company_currency / bank_balance_in_account_currency return exchange_rate + + +@frappe.whitelist() +def get_invoice_due_dates(name): + result = frappe.get_list( + doctype='GL Entry', group_by='name, due_date', + filters={'voucher_no': name, "ifnull(due_date, '')": ('!=', '')}, + fields=['due_date'], distinct=True + ) + + return result From 501ef8733bacd48d2862a9f4f6884ec34912a050 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 30 Aug 2017 21:02:20 +0100 Subject: [PATCH 018/164] fix due_date autopopulate commit --- .../doctype/journal_entry/journal_entry.js | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 934dbeb03a0..38bd612e2c8 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -185,24 +185,38 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ }) }, + due_date_options_cache: {}, + reference_name: function(doc, cdt, cdn) { var d = frappe.get_doc(cdt, cdn); + var me = this; - const get_invoice_due_dates = (invoice_name) => { - frappe.call({ - method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_invoice_due_dates", - args: {name: invoice_name}, - callback: function(r){ - const wrapper = cur_frm.fields_dict["accounts"].wrapper; - const input = $(wrapper).find("select[data-fieldname=reference_due_date]"); + const get_invoice_due_dates = invoice_name => { + const options = this.due_date_options_cache[invoice_name]; + const input = $(cur_frm.fields_dict["accounts"].wrapper).find("select[data-fieldname=reference_due_date]"); - input.children('option').remove(); - - $.each(r.message, function(key, value) { - input.append(new Option(value.due_date, "", false, false)); - }); - } - }); + if (options) { + input.empty(); + input.add_options(options); + frappe.model.set_value(cdt, cdn, "reference_due_date", options[0]); + } + else { + frappe.call({ + method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_invoice_due_dates", + args: {name: invoice_name}, + callback: function(r) { + const options = []; + $.each(r.message, function(key, value) { + options.push(value.due_date); + }); + input.empty(); + input.add_options(options); + frappe.model.set_value(cdt, cdn, "reference_due_date", options[0]); + me.due_date_options_cache[d.reference_name] = options; + console.log("input:", input); + } + }); + } } if(d.reference_name) { @@ -215,7 +229,7 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ if (d.reference_type==="Journal Entry" && !flt(d.credit) && !flt(d.debit)) { this.get_outstanding('Journal Entry', d.reference_name, doc.company, d); } - if( in_list(d.reference_type), ["Sales Invoice", "Purchase Invoice"]) { + if( in_list(["Sales Invoice", "Purchase Invoice"]), d.reference_type) { get_invoice_due_dates(d.reference_name); } } From 93c015a42b7663cff0696d6546ecbe05b6c28292 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 30 Aug 2017 21:05:38 +0100 Subject: [PATCH 019/164] add due_date in GL Entry from Journal Entry --- erpnext/accounts/doctype/journal_entry/journal_entry.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 68f4cc53bee..f7e40231e14 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -436,7 +436,8 @@ class JournalEntry(AccountsController): "against_voucher": d.reference_name, "remarks": self.remark, "cost_center": d.cost_center, - "project": d.project + "project": d.project, + "due_date": d.reference_due_date }) ) From 6de18ce589b2ff903f779df9d7189ead2bbe08aa Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 30 Aug 2017 21:20:41 +0100 Subject: [PATCH 020/164] codacy fixes --- erpnext/accounts/doctype/journal_entry/journal_entry.js | 1 - erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 38bd612e2c8..4ce68865bea 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -213,7 +213,6 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ input.add_options(options); frappe.model.set_value(cdt, cdn, "reference_due_date", options[0]); me.due_date_options_cache[d.reference_name] = options; - console.log("input:", input); } }); } diff --git a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py index 1e0ca6a9185..8ececeb6e2f 100644 --- a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py +++ b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py @@ -1,10 +1,8 @@ from __future__ import unicode_literals import frappe -""" -This will update existing GL Entries by saving its linked Purchase/Sales Invoice's -and Journal Entry's due date as the due date for the GL Entry -""" +"""This will update existing GL Entries by saving its linked Purchase/Sales Invoice's +and Journal Entry's due date as the due date for the GL Entry""" def execute(): From e5460ab1df692d1260e1d7f14a84b9765e76c1c1 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 30 Aug 2017 22:13:39 +0100 Subject: [PATCH 021/164] rename patch --- erpnext/patches.txt | 2 +- erpnext/patches/v8_10/__init__.py | 0 .../patches/{v8_8 => v8_10}/update_gl_due_date_for_pi_and_si.py | 0 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 erpnext/patches/v8_10/__init__.py rename erpnext/patches/{v8_8 => v8_10}/update_gl_due_date_for_pi_and_si.py (100%) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 2ac000b4cee..5f7ee4ecbc0 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -435,4 +435,4 @@ erpnext.patches.v8_5.remove_project_type_property_setter erpnext.patches.v8_7.add_more_gst_fields erpnext.patches.v8_7.fix_purchase_receipt_status erpnext.patches.v8_6.rename_bom_update_tool -erpnext.patches.v8_8.update_gl_due_date_for_pi_and_si +erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si diff --git a/erpnext/patches/v8_10/__init__.py b/erpnext/patches/v8_10/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py similarity index 100% rename from erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py rename to erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py From 226164d81c1bb848198615193231f084335e6a51 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 09:35:47 +0100 Subject: [PATCH 022/164] add payment terms in customer master --- .../selling/doctype/customer/customer.json | 66 ++++++++++++++++++- .../selling/doctype/customer/test_customer.js | 23 +++++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 erpnext/selling/doctype/customer/test_customer.js diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 52c6b6db862..fd394cbb67a 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -786,7 +786,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 1, - "collapsible_depends_on": "eval:doc.credit_days || doc.credit_limit", + "collapsible_depends_on": "", "columns": 0, "fieldname": "credit_limit_section", "fieldtype": "Section Break", @@ -907,6 +907,68 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "eval:doc.payment_terms", + "columns": 0, + "fieldname": "payment_terms_section", + "fieldtype": "Section 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, + "label": "Payment Terms", + "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, + "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, @@ -1202,7 +1264,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-07-24 00:55:07.445783", + "modified": "2017-08-31 09:37:11.654209", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/selling/doctype/customer/test_customer.js b/erpnext/selling/doctype/customer/test_customer.js new file mode 100644 index 00000000000..65b81af32c1 --- /dev/null +++ b/erpnext/selling/doctype/customer/test_customer.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Customer", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Customer + () => frappe.tests.make('Customer', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); From 3dfbd957b78875ae1488da4708600a65bdad6394 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 09:40:17 +0100 Subject: [PATCH 023/164] add payment terms to supplier master --- erpnext/buying/doctype/supplier/supplier.json | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 711e05d913d..3681d0d3e4a 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -652,6 +652,68 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "eval:doc.payment_terms", + "columns": 0, + "fieldname": "payment_terms_section", + "fieldtype": "Section 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, + "label": "Payment Terms", + "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, + "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, @@ -970,7 +1032,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-07-06 16:40:46.935608", + "modified": "2017-08-31 09:39:14.816188", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", From 2775175b170e161bf71c417b7bcc5823f9871fae Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 11:52:14 +0100 Subject: [PATCH 024/164] add payment terms to customer master --- .../selling/doctype/customer/customer.json | 36 ++----------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index fd394cbb67a..9cb9d6a104e 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -830,7 +830,7 @@ "label": "Credit Days Based On", "length": 0, "no_copy": 0, - "options": "\nFixed Days\nLast Day of the Next Month", + "options": "\nFixed Days\nLast Day of the Next Month\nPayment Terms", "permlevel": 0, "precision": "", "print_hide": 0, @@ -907,43 +907,13 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "eval:doc.payment_terms", - "columns": 0, - "fieldname": "payment_terms_section", - "fieldtype": "Section 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, - "label": "Payment Terms", - "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, + "depends_on": "eval:doc.credit_days_based_on == 'Payment Terms'", "fieldname": "payment_terms", "fieldtype": "Link", "hidden": 0, @@ -1264,7 +1234,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 09:37:11.654209", + "modified": "2017-08-31 11:41:10.823682", "modified_by": "Administrator", "module": "Selling", "name": "Customer", From 762c810fa2a022a54146b0eaf91615501f5d749f Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 11:52:49 +0100 Subject: [PATCH 025/164] add payment terms to supplier master --- erpnext/buying/doctype/supplier/supplier.json | 36 ++----------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 3681d0d3e4a..f1abf0ceb2f 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -609,7 +609,7 @@ "label": "Credit Days Based On", "length": 0, "no_copy": 0, - "options": "\nFixed Days\nLast Day of the Next Month", + "options": "\nFixed Days\nLast Day of the Next Month\nPayment Terms", "permlevel": 0, "precision": "", "print_hide": 0, @@ -652,43 +652,13 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "eval:doc.payment_terms", - "columns": 0, - "fieldname": "payment_terms_section", - "fieldtype": "Section 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, - "label": "Payment Terms", - "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, + "depends_on": "eval:doc.credit_days_based_on == 'Payment Terms'", "fieldname": "payment_terms", "fieldtype": "Link", "hidden": 0, @@ -1032,7 +1002,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 09:39:14.816188", + "modified": "2017-08-31 11:37:24.321645", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", From 400d0466535fec00f011bf1ce96b17d005bbe6eb Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 13:44:57 +0100 Subject: [PATCH 026/164] set payment terms template in `get_party_details` --- erpnext/accounts/party.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index ba7ae323d46..7d906cae015 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -51,6 +51,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company= set_other_values(out, party, party_type) set_price_list(out, party, party_type, price_list) out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_type) + out["payment_terms_template"] = get_pyt_term_template(party.name, party_type) if not out.get("currency"): out["currency"] = currency @@ -345,6 +346,16 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup return get_tax_template(posting_date, args) + +@frappe.whitelist() +def get_pyt_term_template(party_name, party_type): + template = None + if party_type in ('Customer', 'Supplier'): + template = frappe.db.get_value(party_type, party_name, fieldname='payment_terms') + + return template + + def validate_party_frozen_disabled(party_type, party_name): if party_type and party_name: if party_type in ("Customer", "Supplier"): From 229b583715a359993b80e2703fe7023e197d0835 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 14:30:53 +0100 Subject: [PATCH 027/164] disable due date field if form has payment schedule data --- .../purchase_invoice/purchase_invoice.js | 19 +++++++++++++++++++ .../doctype/sales_invoice/sales_invoice.js | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index ac5f5dd3214..8d4d2d4284a 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -372,3 +372,22 @@ frappe.ui.form.on("Purchase Invoice", { frm.toggle_reqd("supplier_warehouse", frm.doc.is_subcontracted==="Yes"); } }) + +frappe.ui.form.on("Purchase Invoice", { + payment_terms_template: function() { + cur_frm.trigger("disable_due_date"); + }, + + disable_due_date: function() { + const disable = !cur_frm.doc.payment_terms_template && cur_frm.doc.payment_schedule.length == 0; + cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); + }, + +}); + +frappe.ui.form.on("Payment Schedule", { + payment_schedule_remove: function() { + cur_frm.trigger("disable_due_date"); + }, + +}); \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index ef233c67995..2c11e1701ec 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -564,3 +564,22 @@ var calculate_total_billing_amount = function(frm) { refresh_field('total_billing_amount') } + +frappe.ui.form.on("Sales Invoice", { + payment_terms_template: function() { + cur_frm.trigger("disable_due_date"); + }, + + disable_due_date: function() { + const disable = !cur_frm.doc.payment_terms_template && cur_frm.doc.payment_schedule.length == 0; + cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); + }, + +}); + +frappe.ui.form.on("Payment Schedule", { + payment_schedule_remove: function() { + cur_frm.trigger("disable_due_date"); + }, + +}); \ No newline at end of file From 657ecd52277733bd57f72e3fb0d9b50c28e65b46 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 16:06:56 +0100 Subject: [PATCH 028/164] adjustment: removes credit_based_on field --- .../selling/doctype/customer/customer.json | 69 +------------------ 1 file changed, 3 insertions(+), 66 deletions(-) diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 9cb9d6a104e..222d2e569eb 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -812,69 +812,6 @@ "unique": 0, "width": "50%" }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "credit_days_based_on", - "fieldtype": "Select", - "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": "Credit Days Based On", - "length": 0, - "no_copy": 0, - "options": "\nFixed Days\nLast Day of the Next Month\nPayment Terms", - "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, - "depends_on": "eval:doc.credit_days_based_on=='Fixed Days'", - "fieldname": "credit_days", - "fieldtype": "Int", - "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": "Credit Days", - "length": 0, - "no_copy": 0, - "oldfieldname": "credit_days", - "oldfieldtype": "Int", - "permlevel": 1, - "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, @@ -913,7 +850,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.credit_days_based_on == 'Payment Terms'", + "depends_on": "", "fieldname": "payment_terms", "fieldtype": "Link", "hidden": 0, @@ -1234,8 +1171,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 11:41:10.823682", - "modified_by": "Administrator", + "modified": "2017-08-31 15:12:18.637132", + "modified_by": "tundebabzy@gmail.com", "module": "Selling", "name": "Customer", "name_case": "Title Case", From e44ce5d88e1d1fe431897b8115f99bcb696f6542 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 16:11:42 +0100 Subject: [PATCH 029/164] adjustment: removes credit_days_based on and credit_days fields --- erpnext/buying/doctype/supplier/supplier.json | 67 +------------------ 1 file changed, 3 insertions(+), 64 deletions(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index f1abf0ceb2f..e6cea536f59 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -597,68 +597,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "credit_days_based_on", - "fieldtype": "Select", - "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": "Credit Days Based On", - "length": 0, - "no_copy": 0, - "options": "\nFixed Days\nLast Day of the Next Month\nPayment Terms", - "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, - "depends_on": "eval:doc.credit_days_based_on == 'Fixed Days'", - "fieldname": "credit_days", - "fieldtype": "Int", - "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": "Credit Days", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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, - "depends_on": "eval:doc.credit_days_based_on == 'Payment Terms'", + "depends_on": "", "fieldname": "payment_terms", "fieldtype": "Link", "hidden": 0, @@ -1002,8 +941,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 11:37:24.321645", - "modified_by": "Administrator", + "modified": "2017-08-31 16:10:44.049915", + "modified_by": "tundebabzy@gmail.com", "module": "Buying", "name": "Supplier", "name_case": "Title Case", From 3b4bd3791d90d46ca90f28c3f7b66f60c8cce093 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 16:28:47 +0100 Subject: [PATCH 030/164] adjust `get_due_date` to calculate based on payment term template --- erpnext/accounts/party.py | 43 +++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 7d906cae015..33ce0323880 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -9,7 +9,7 @@ from frappe import _, msgprint, scrub from frappe.defaults import get_user_permissions from frappe.model.utils import get_fetch_values from frappe.utils import (add_days, getdate, formatdate, get_first_day, date_diff, - add_years, get_timestamp, nowdate, flt) + add_years, get_timestamp, nowdate, flt, add_months, get_last_day) from frappe.contacts.doctype.address.address import (get_address_display, get_default_address, get_company_address) from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact @@ -162,7 +162,7 @@ def set_account_and_due_date(party, account, party_type, company, posting_date, out = { party_type.lower(): party, account_fieldname : account, - "due_date": get_due_date(posting_date, party_type, party, company) + "due_date": get_due_date(posting_date, party_type, party) } return out @@ -259,22 +259,43 @@ def validate_party_accounts(doc): if doc.get("default_currency") and party_account_currency and company_default_currency: if doc.default_currency != party_account_currency and doc.default_currency != company_default_currency: - frappe.throw(_("Billing currency must be equal to either default comapany's currency or party account currency")) + frappe.throw(_("Billing currency must be equal to either default company's currency or party account currency")) + @frappe.whitelist() -def get_due_date(posting_date, party_type, party, company): - """Set Due Date = Posting Date + Credit Days""" +def get_due_date(posting_date, party_type, party): + """Get due date from `Payment Terms Template`""" due_date = None if posting_date and party: due_date = posting_date - credit_days_based_on, credit_days = get_credit_days(party_type, party, company) - if credit_days_based_on == "Fixed Days" and credit_days: - due_date = add_days(posting_date, credit_days) - elif credit_days_based_on == "Last Day of the Next Month": - due_date = (get_first_day(posting_date, 0, 2) + datetime.timedelta(-1)).strftime("%Y-%m-%d") + template_name = get_pyt_term_template(party, party_type) + if template_name: + due_date = get_due_date_from_template(template_name, posting_date) return due_date + +def get_due_date_from_template(template_name, posting_date): + """ + Inspects all `Payment Term`s from the a `Payment Terms Template` and returns the due + date after considering all the `Payment Term`s requirements. + :param template_name: Name of the `Payment Terms Template` + :return: String representing the calculated due date + """ + due_date = getdate(posting_date) + template = frappe.get_doc('Payment Terms Template', template_name) + + for term in template.terms: + if term.due_date_based_on == 'Day(s) after invoice date': + due_date = max(due_date, add_days(due_date, term.credit_days)) + elif term.due_date_based_on == 'Day(s) after the end of the invoice month': + due_date = max(due_date, add_days(get_last_day(due_date), term.credit_days)) + else: + due_date = max(due_date, add_months(get_last_day(due_date), term.credit_months)) + + return due_date + + def get_credit_days(party_type, party, company): credit_days = 0 if party_type and party: @@ -303,7 +324,7 @@ def validate_due_date(posting_date, due_date, party_type, party, company): if getdate(due_date) < getdate(posting_date): frappe.throw(_("Due Date cannot be before Posting Date")) else: - default_due_date = get_due_date(posting_date, party_type, party, company) + default_due_date = get_due_date(posting_date, party_type, party) if not default_due_date: return From 8935f6546c56c633bf55a14d56d4e5ac7aebeaf5 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 16:31:15 +0100 Subject: [PATCH 031/164] removes `get_credit_days` function as it is no longer useful --- erpnext/accounts/party.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 33ce0323880..8991459f49e 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -296,30 +296,6 @@ def get_due_date_from_template(template_name, posting_date): return due_date -def get_credit_days(party_type, party, company): - credit_days = 0 - if party_type and party: - if party_type == "Customer": - credit_days_based_on, credit_days, customer_group = \ - frappe.db.get_value(party_type, party, ["credit_days_based_on", "credit_days", "customer_group"]) - else: - credit_days_based_on, credit_days, supplier_type = \ - frappe.db.get_value(party_type, party, ["credit_days_based_on", "credit_days", "supplier_type"]) - - if not credit_days_based_on: - if party_type == "Customer" and customer_group: - credit_days_based_on, credit_days = \ - frappe.db.get_value("Customer Group", customer_group, ["credit_days_based_on", "credit_days"]) - elif party_type == "Supplier" and supplier_type: - credit_days_based_on, credit_days = \ - frappe.db.get_value("Supplier Type", supplier_type, ["credit_days_based_on", "credit_days"]) - - if not credit_days_based_on: - credit_days_based_on, credit_days = \ - frappe.db.get_value("Company", company, ["credit_days_based_on", "credit_days"]) - - return credit_days_based_on, credit_days - def validate_due_date(posting_date, due_date, party_type, party, company): if getdate(due_date) < getdate(posting_date): frappe.throw(_("Due Date cannot be before Posting Date")) From 1c2edaebc43254545b3707ba1f6efdfbee88d74f Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 31 Aug 2017 22:52:06 +0100 Subject: [PATCH 032/164] patch customer records - creates payment term and payment term template based on credit_days setting - sets payment term template for records that had credit_days --- erpnext/patches.txt | 1 + .../change_default_customer_credit_days.py | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 erpnext/patches/v8_10/change_default_customer_credit_days.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 5f7ee4ecbc0..f94c5797fa4 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -436,3 +436,4 @@ erpnext.patches.v8_7.add_more_gst_fields erpnext.patches.v8_7.fix_purchase_receipt_status erpnext.patches.v8_6.rename_bom_update_tool erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si +erpnext.patches.v8_10.change_default_customer_credit_days diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py new file mode 100644 index 00000000000..b016b66fa16 --- /dev/null +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -0,0 +1,65 @@ +from __future__ import unicode_literals +import frappe + + +def execute(): + payment_terms = [] + customers = [] + credit_days = frappe.db.sql( + "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `customer_name` from " + "`tabCustomer` where credit_days_based_on='Fixed Days' or " + "credit_days_based_on='Last Day of the Next Month'") + + credit_records = ((record[0], record[1], record[2]) for record in credit_days) + for days, based_on, customer_name in credit_records: + payment_term = make_payment_term(days, based_on) + payment_terms.append('WHEN `customer_name`="%s" THEN "%s"' % (customer_name, payment_term.payment_term_name)) + customers.append(customer_name) + make_template(payment_term) + + begin_query_str = "UPDATE `tabCustomer` SET `payment_terms` = CASE " + value_query_str = " ".join(payment_terms) + cond_query_str = " ELSE `payment_terms` END WHERE " + + frappe.db.sql( + begin_query_str + value_query_str + cond_query_str + '`customer_name` IN %s', + (customers,) + ) + + +def make_template(payment_term): + doc = frappe.new_doc('Payment Terms Template Detail') + doc.payment_term = payment_term.payment_term_name + doc.due_date_based_on = payment_term.due_date_based_on + doc.invoice_portion = payment_term.invoice_portion + doc.description = payment_term.description + doc.credit_days = payment_term.credit_days + doc.credit_months = payment_term.credit_months + + template = frappe.new_doc('Payment Terms Template') + template.template_name = 'Default Payment Term - {0}'.format(payment_term.payment_term_name) + template.terms = [doc] + template.save() + + +def make_payment_term(days, based_on): + based_on_map = { + 'Fixed Days': 'Day(s) after invoice date', + 'Last Day of the Next Month': 'Month(s) after the end of the invoice month' + } + + doc = frappe.new_doc('Payment Term') + doc.due_date_based_on = based_on_map.get(based_on) + doc.invoice_portion = 100 + + if based_on == 'Fixed Days': + doc.credit_days = days + doc.description = 'Net payable within {0} days'.format(days) + doc.payment_term_name = 'N{0}'.format(days) + else: + doc.credit_months = 1 + doc.description = 'Net payable by the end of next month'.format(days) + doc.payment_term_name = 'EO2M' + + doc.save() + return doc From f0e9dd25973aa8e6f08bd536aa637dffc32aac1b Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 1 Sep 2017 11:34:26 +0100 Subject: [PATCH 033/164] patch to add due_date to GL Entry table --- erpnext/patches.txt | 1 + erpnext/patches/v8_10/add_due_date_to_gle.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 erpnext/patches/v8_10/add_due_date_to_gle.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index f94c5797fa4..f3637996466 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -435,5 +435,6 @@ erpnext.patches.v8_5.remove_project_type_property_setter erpnext.patches.v8_7.add_more_gst_fields erpnext.patches.v8_7.fix_purchase_receipt_status erpnext.patches.v8_6.rename_bom_update_tool +erpnext.patches.v8_10.add_due_date_to_gle erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si erpnext.patches.v8_10.change_default_customer_credit_days diff --git a/erpnext/patches/v8_10/add_due_date_to_gle.py b/erpnext/patches/v8_10/add_due_date_to_gle.py new file mode 100644 index 00000000000..2a088bd2188 --- /dev/null +++ b/erpnext/patches/v8_10/add_due_date_to_gle.py @@ -0,0 +1,6 @@ +from __future__ import unicode_literals +import frappe + + +def execute(): + frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE DEFAULT NULL") From b3a6338c79f914846933f34f94bb50cc4a14efa0 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 1 Sep 2017 11:35:22 +0100 Subject: [PATCH 034/164] patch replace credit_days with payment terms schedule --- .../patches/v8_10/change_default_customer_credit_days.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py index b016b66fa16..3b9f65da3b8 100644 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -21,10 +21,11 @@ def execute(): value_query_str = " ".join(payment_terms) cond_query_str = " ELSE `payment_terms` END WHERE " - frappe.db.sql( - begin_query_str + value_query_str + cond_query_str + '`customer_name` IN %s', - (customers,) - ) + if customers: + frappe.db.sql( + begin_query_str + value_query_str + cond_query_str + '`customer_name` IN %s', + (customers,) + ) def make_template(payment_term): From 7b7dcddf8694151aa012644fc8b215fda9cc688c Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 1 Sep 2017 11:36:08 +0100 Subject: [PATCH 035/164] modify `get_due_date` call from sales/purchase invoice --- erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py | 2 +- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index bf620ab27ac..06a4974ea10 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -92,7 +92,7 @@ class PurchaseInvoice(BuyingController): if not self.credit_to: self.credit_to = get_party_account("Supplier", self.supplier, self.company) if not self.due_date: - self.due_date = get_due_date(self.posting_date, "Supplier", self.supplier, self.company) + self.due_date = get_due_date(self.posting_date, "Supplier", self.supplier) super(PurchaseInvoice, self).set_missing_values(for_validate) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index a5bf4ff11f4..afed3e876dc 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -241,7 +241,7 @@ class SalesInvoice(SellingController): if not self.debit_to: self.debit_to = get_party_account("Customer", self.customer, self.company) if not self.due_date and self.customer: - self.due_date = get_due_date(self.posting_date, "Customer", self.customer, self.company) + self.due_date = get_due_date(self.posting_date, "Customer", self.customer) super(SalesInvoice, self).set_missing_values(for_validate) From cbd72f6113c43e68e093ecde77f62e5c072c6a1e Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 1 Sep 2017 11:48:00 +0100 Subject: [PATCH 036/164] adjust failing tests --- .../doctype/sales_invoice/test_sales_invoice.py | 14 -------------- erpnext/buying/doctype/supplier/test_supplier.py | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 23007fbc1ae..add640a3326 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -890,20 +890,6 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(si.get("items")[0].serial_no, dn.get("items")[0].serial_no) - def test_invoice_due_date_against_customers_credit_days(self): - # set customer's credit days - frappe.db.set_value("Customer", "_Test Customer", "credit_days_based_on", "Fixed Days") - frappe.db.set_value("Customer", "_Test Customer", "credit_days", 10) - - si = create_sales_invoice() - self.assertEqual(si.due_date, add_days(nowdate(), 10)) - - # set customer's credit days is last day of the next month - frappe.db.set_value("Customer", "_Test Customer", "credit_days_based_on", "Last Day of the Next Month") - - si1 = create_sales_invoice(posting_date="2015-07-05") - self.assertEqual(si1.due_date, "2015-08-31") - def test_return_sales_invoice(self): set_perpetual_inventory() make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index 1d089e70982..298eb009213 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -16,7 +16,7 @@ class TestSupplier(unittest.TestCase): frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", "Fixed Days") frappe.db.set_value("Supplier", "_Test Supplier", "credit_days", 10) - due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier") self.assertEqual(due_date, "2016-02-01") # Set Credit Limit based on Last day next month From 975eff7310920420e29187e3a3d38b1ce235b301 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 1 Sep 2017 12:10:44 +0100 Subject: [PATCH 037/164] remove redundant test case --- .../buying/doctype/supplier/test_supplier.py | 47 +------------------ 1 file changed, 1 insertion(+), 46 deletions(-) diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index 298eb009213..89e08620531 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -10,52 +10,8 @@ from frappe.test_runner import make_test_records test_records = frappe.get_test_records('Supplier') + class TestSupplier(unittest.TestCase): - def test_supplier_due_date_against_supplier_credit_limit(self): - # Set Credit Limit based on Fixed days - frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", "Fixed Days") - frappe.db.set_value("Supplier", "_Test Supplier", "credit_days", 10) - - due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier") - self.assertEqual(due_date, "2016-02-01") - - # Set Credit Limit based on Last day next month - frappe.db.set_value("Supplier", "_Test Supplier", "credit_days", 0) - frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", - "Last Day of the Next Month") - - # Leap year - due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") - self.assertEqual(due_date, "2016-02-29") - # Non Leap year - due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") - self.assertEqual(due_date, "2017-02-28") - - frappe.db.set_value("Supplier", "_Test Supplier", "credit_days_based_on", "") - - # Set credit limit for the supplier type instead of supplier and evaluate the due date - # based on Fixed days - frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", - "Fixed Days") - frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days", 10) - - due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") - self.assertEqual(due_date, "2016-02-01") - - # Set credit limit for the supplier type instead of supplier and evaluate the due date - # based on Last day of next month - frappe.db.set_value("Supplier", "_Test Supplier Type", "credit_days", 0) - frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", - "Last Day of the Next Month") - - # Leap year - due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") - self.assertEqual(due_date, "2016-02-29") - # Non Leap year - due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") - self.assertEqual(due_date, "2017-02-28") - - def test_supplier_disabled(self): make_test_records("Item") @@ -71,7 +27,6 @@ class TestSupplier(unittest.TestCase): po.save() - def test_supplier_country(self): # Test that country field exists in Supplier DocType supplier = frappe.get_doc('Supplier', '_Test Supplier with Country') From feffca2b05c8c5183188d807c0efcff45cc84a04 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 13:34:31 +0100 Subject: [PATCH 038/164] patch to add payment_terms_field --- .../patches/v8_10/add_payment_terms_field_to_supplier.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py new file mode 100644 index 00000000000..c5a6fb19428 --- /dev/null +++ b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py @@ -0,0 +1,9 @@ +from __future__ import unicode_literals +import frappe + + +def execute(): + if not frappe.db.has_column("Customer", "payment_terms"): + frappe.db.sql("ALTER TABLE `tabCustomer` ADD COLUMN `payment_terms` DATE DEFAULT NULL") + if not frappe.db.has_column("Supplier", "payment_terms"): + frappe.db.sql("ALTER TABLE `tabSupplier` ADD COLUMN `payment_terms` DATE DEFAULT NULL") From 76bba08e457e16c86bc3f012e9d00e1f7f1929ec Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 13:37:32 +0100 Subject: [PATCH 039/164] patch to create and set default payment term in customer/supplier --- .../change_default_customer_credit_days.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py index 3b9f65da3b8..c4376fa9741 100644 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -5,6 +5,7 @@ import frappe def execute(): payment_terms = [] customers = [] + suppliers = [] credit_days = frappe.db.sql( "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `customer_name` from " "`tabCustomer` where credit_days_based_on='Fixed Days' or " @@ -27,6 +28,39 @@ def execute(): (customers,) ) + # reset + payment_terms = [] + credit_days = frappe.db.sql( + "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `supplier_name` from " + "`tabSupplier` where credit_days_based_on='Fixed Days' or " + "credit_days_based_on='Last Day of the Next Month'") + + credit_records = ((record[0], record[1], record[2]) for record in credit_days) + for days, based_on, supplier_name in credit_records: + if based_on == "Fixed Days": + pyt_term_name = 'N{0}'.format(days) + else: + pyt_term_name = 'EO2M' + + if not frappe.db.exists("Payment Term", pyt_term_name): + payment_term = make_payment_term(days, based_on) + make_template(payment_term) + else: + payment_term = frappe.get_doc("Payment Term", pyt_term_name) + + payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_name, payment_term.payment_term_name)) + suppliers.append(supplier_name) + + begin_query_str = "UPDATE `tabSupplier` SET `payment_terms` = CASE " + value_query_str = " ".join(payment_terms) + cond_query_str = " ELSE `payment_terms` END WHERE " + + if customers: + frappe.db.sql( + begin_query_str + value_query_str + cond_query_str + '`supplier_name` IN %s', + (suppliers,) + ) + def make_template(payment_term): doc = frappe.new_doc('Payment Terms Template Detail') From bc9b5d699e7bdf665d7866509607653aec6ca893 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 13:40:54 +0100 Subject: [PATCH 040/164] fix patch --- erpnext/patches/v8_10/add_due_date_to_gle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/patches/v8_10/add_due_date_to_gle.py b/erpnext/patches/v8_10/add_due_date_to_gle.py index 2a088bd2188..047c883f0f1 100644 --- a/erpnext/patches/v8_10/add_due_date_to_gle.py +++ b/erpnext/patches/v8_10/add_due_date_to_gle.py @@ -3,4 +3,5 @@ import frappe def execute(): - frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE DEFAULT NULL") + if not frappe.db.has_column("GL Entry", "due_date"): + frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE DEFAULT NULL") From c6d60e1de3bc13f4689f52200c44fbc55265e702 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 13:41:17 +0100 Subject: [PATCH 041/164] update patch list --- erpnext/patches.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index f3637996466..a6df2046991 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -437,4 +437,5 @@ erpnext.patches.v8_7.fix_purchase_receipt_status erpnext.patches.v8_6.rename_bom_update_tool erpnext.patches.v8_10.add_due_date_to_gle erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si +erpnext.patches.v8_10.add_payment_terms_field_to_supplier erpnext.patches.v8_10.change_default_customer_credit_days From 4163c9529d84feaa2bed2180e28adaca65f67330 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 19:30:01 +0100 Subject: [PATCH 042/164] fix `get_due_date` function to return date as string --- erpnext/accounts/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 8991459f49e..32c7e3e8d6d 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -270,7 +270,7 @@ def get_due_date(posting_date, party_type, party): due_date = posting_date template_name = get_pyt_term_template(party, party_type) if template_name: - due_date = get_due_date_from_template(template_name, posting_date) + due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d") return due_date From 95b3d7c619091b5d6b3fc5e60fd704b3965bf833 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 19:32:14 +0100 Subject: [PATCH 043/164] patch for payment term field in Supplier Type --- .../v8_10/add_payment_terms_field_to_supplier_type.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py new file mode 100644 index 00000000000..78b8943092f --- /dev/null +++ b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals +import frappe + + +def execute(): + if not frappe.db.has_column("Supplier Type", "payment_terms"): + frappe.db.sql("ALTER TABLE `tabSupplier Type` ADD COLUMN `payment_terms` VARCHAR(140) NULL") From 57171cdc48d5e5741eb0d739eb08085c15d62a96 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 19:33:35 +0100 Subject: [PATCH 044/164] patch for credit days in Supplier Type --- ...hange_default_supplier_type_credit_days.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 erpnext/patches/v8_10/change_default_supplier_type_credit_days.py diff --git a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py b/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py new file mode 100644 index 00000000000..a6696485356 --- /dev/null +++ b/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py @@ -0,0 +1,39 @@ +import frappe +from patches.v8_10.change_default_customer_credit_days import make_payment_term, make_template + + +def execute(): + payment_terms = [] + supplier_types = [] + + credit_days = frappe.db.sql( + "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `supplier_type` from " + "`tabSupplier Type` where credit_days_based_on='Fixed Days' or " + "credit_days_based_on='Last Day of the Next Month'") + + records = ((record[0], record[1], record[2]) for record in credit_days) + + for days, based_on, supplier_type in records: + if based_on == "Fixed Days": + pyt_term_name = 'N{0}'.format(days) + else: + pyt_term_name = 'EO2M' + + if not frappe.db.exists("Payment Term", pyt_term_name): + payment_term = make_payment_term(days, based_on) + make_template(payment_term) + else: + payment_term = frappe.get_doc("Payment Term", pyt_term_name) + + payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_type, payment_term.payment_term_name)) + supplier_types.append(supplier_type) + + begin_query_str = "UPDATE `tabSupplier` SET `payment_terms` = CASE " + value_query_str = " ".join(payment_terms) + cond_query_str = " ELSE `payment_terms` END WHERE " + + if supplier_types: + frappe.db.sql( + begin_query_str + value_query_str + cond_query_str + '`supplier_name` IN %s', + (supplier_types,) + ) From 635423d70f27e91950b2b6bfd32fe2d748fbdceb Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 19:37:54 +0100 Subject: [PATCH 045/164] rewrite Supplier test cases --- .../doctype/payment_term/test_records.json | 34 +++++++++++ .../payment_terms_template/test_records.json | 60 +++++++++++++++++++ .../buying/doctype/supplier/test_records.json | 6 ++ .../buying/doctype/supplier/test_supplier.py | 48 ++++++++++++++- .../supplier_type/test_supplier_type.js | 23 +++++++ 5 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 erpnext/accounts/doctype/payment_term/test_records.json create mode 100644 erpnext/accounts/doctype/payment_terms_template/test_records.json create mode 100644 erpnext/setup/doctype/supplier_type/test_supplier_type.js diff --git a/erpnext/accounts/doctype/payment_term/test_records.json b/erpnext/accounts/doctype/payment_term/test_records.json new file mode 100644 index 00000000000..ef6e0693b3c --- /dev/null +++ b/erpnext/accounts/doctype/payment_term/test_records.json @@ -0,0 +1,34 @@ +[ + { + "doctype":"Payment Term", + "due_date_based_on":"Day(s) after invoice date", + "payment_term_name":"_Test N30", + "description":"_Test Net 30 Days", + "invoice_portion":50, + "credit_days":30 + }, + { + "doctype":"Payment Term", + "due_date_based_on":"Day(s) after invoice date", + "payment_term_name":"_Test COD", + "description":"_Test Cash on Delivery", + "invoice_portion":50, + "credit_days":0 + }, + { + "doctype":"Payment Term", + "due_date_based_on":"Month(s) after the end of the invoice month", + "payment_term_name":"_Test EONM", + "description":"_Test End of Next Month", + "invoice_portion":100, + "credit_months":1 + }, + { + "doctype":"Payment Term", + "due_date_based_on":"Day(s) after invoice date", + "payment_term_name":"_Test N30 1", + "description":"_Test Net 30 Days", + "invoice_portion":100, + "credit_days":30 + } +] \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_terms_template/test_records.json b/erpnext/accounts/doctype/payment_terms_template/test_records.json new file mode 100644 index 00000000000..fea0b35c112 --- /dev/null +++ b/erpnext/accounts/doctype/payment_terms_template/test_records.json @@ -0,0 +1,60 @@ +[ + { + "doctype":"Payment Terms Template", + "terms":[ + { + "doctype":"Payment Terms Template Detail", + "due_date_based_on":"Day(s) after invoice date", + "idx":1, + "description":"Cash on Delivery", + "invoice_portion":50, + "credit_days":0, + "credit_months":0, + "payment_term":"_Test COD" + }, + { + "doctype":"Payment Terms Template Detail", + "due_date_based_on":"Day(s) after invoice date", + "idx":2, + "description":"Net 30 Days ", + "invoice_portion":50, + "credit_days":30, + "credit_months":0, + "payment_term":"_Test N30" + } + ], + "template_name":"_Test Payment Term Template" + }, + { + "doctype":"Payment Terms Template", + "terms":[ + { + "doctype":"Payment Terms Template Detail", + "due_date_based_on":"Month(s) after the end of the invoice month", + "idx":1, + "description":"_Test End of Next Months", + "invoice_portion":100, + "credit_days":0, + "credit_months":1, + "payment_term":"_Test EONM" + } + ], + "template_name":"_Test Payment Term Template 1" + }, + { + "doctype":"Payment Terms Template", + "terms":[ + { + "doctype":"Payment Terms Template Detail", + "due_date_based_on":"Day(s) after invoice date", + "idx":1, + "description":"_Test Net Within 30 days", + "invoice_portion":100, + "credit_days":30, + "credit_months":0, + "payment_term":"_Test N30 1" + } + ], + "template_name":"_Test Payment Term Template 3" + } +] \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json index fa728bed114..1c78807c9c4 100644 --- a/erpnext/buying/doctype/supplier/test_records.json +++ b/erpnext/buying/doctype/supplier/test_records.json @@ -1,4 +1,10 @@ [ + { + "doctype": "Supplier", + "supplier_name": "_Test Supplier With Template 1", + "supplier_type": "_Test Supplier Type", + "payment_terms": "_Test Payment Term Template 3" + }, { "doctype": "Supplier", "supplier_name": "_Test Supplier P", diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index 89e08620531..2af67592602 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -5,13 +5,59 @@ from __future__ import unicode_literals import frappe, unittest from erpnext.accounts.party import get_due_date -from erpnext.exceptions import PartyFrozen, PartyDisabled +from erpnext.exceptions import PartyDisabled from frappe.test_runner import make_test_records +from frappe.utils import add_days, add_months, get_last_day +test_dependencies = ['Payment Term', 'Payment Terms Template'] test_records = frappe.get_test_records('Supplier') class TestSupplier(unittest.TestCase): + def test_supplier_default_payment_terms(self): + # Payment Term based on Days after invoice date + frappe.db.set_value( + "Supplier", "_Test Supplier With Template 1", "payment_terms", "_Test Payment Term Template 3") + + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2016-02-21") + + due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2017-02-21") + + # Payment Term based on last day of month + frappe.db.set_value( + "Supplier", "_Test Supplier With Template 1", "payment_terms", "_Test Payment Term Template 1") + + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2016-02-29") + + due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2017-02-28") + + frappe.db.set_value("Supplier", "_Test Supplier With Template 1", "payment_terms", "") + + # Set credit limit for the supplier type instead of supplier and evaluate the due date + # frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", + # "Fixed Days") + # frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days", 10) + # + # due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + # self.assertEqual(due_date, "2016-02-01") + # + # # Set credit limit for the supplier type instead of supplier and evaluate the due date + # # based on Last day of next month + # frappe.db.set_value("Supplier", "_Test Supplier Type", "credit_days", 0) + # frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", + # "Last Day of the Next Month") + # + # # Leap year + # due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") + # self.assertEqual(due_date, "2016-02-29") + # # Non Leap year + # due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") + # self.assertEqual(due_date, "2017-02-28") + def test_supplier_disabled(self): make_test_records("Item") diff --git a/erpnext/setup/doctype/supplier_type/test_supplier_type.js b/erpnext/setup/doctype/supplier_type/test_supplier_type.js new file mode 100644 index 00000000000..085dddd0b6f --- /dev/null +++ b/erpnext/setup/doctype/supplier_type/test_supplier_type.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Supplier Type", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Supplier Type + () => frappe.tests.make('Supplier Type', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); From 4e4a40e46b59b2397bba7b9721a529f87617feee Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 19:38:41 +0100 Subject: [PATCH 046/164] add new field `payment_terms` to Supplier Type --- .../doctype/supplier_type/supplier_type.json | 47 +++++-------------- 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/erpnext/setup/doctype/supplier_type/supplier_type.json b/erpnext/setup/doctype/supplier_type/supplier_type.json index 9b40e0f4ba9..d7d7084d7ff 100644 --- a/erpnext/setup/doctype/supplier_type/supplier_type.json +++ b/erpnext/setup/doctype/supplier_type/supplier_type.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, "autoname": "field:supplier_type", @@ -12,6 +13,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -42,6 +44,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -71,12 +74,13 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "credit_days_based_on", - "fieldtype": "Select", + "fieldname": "payment_terms", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -84,39 +88,10 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Credit Days Based On", - "length": 0, - "no_copy": 0, - "options": "\nFixed Days\nLast Day of the Next Month", - "permlevel": 1, - "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, - "depends_on": "eval:doc.credit_days_based_on=='Fixed Days'", - "fieldname": "credit_days", - "fieldtype": "Int", - "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": "Credit Days", + "label": "Default Payment Terms Template", "length": 0, "no_copy": 0, + "options": "Payment Terms Template", "permlevel": 0, "precision": "", "print_hide": 0, @@ -130,6 +105,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -158,6 +134,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -189,18 +166,18 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-flag", "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-02-20 13:25:25.641431", + "modified": "2017-09-04 18:54:10.093500", "modified_by": "Administrator", "module": "Setup", "name": "Supplier Type", From 60aecd87b145921c15524f802ab1a04b1c88ae6d Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 4 Sep 2017 19:40:31 +0100 Subject: [PATCH 047/164] fix bugs in patches --- erpnext/patches/v8_10/add_due_date_to_gle.py | 2 +- erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py | 4 ++-- erpnext/patches/v8_10/change_default_customer_credit_days.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/patches/v8_10/add_due_date_to_gle.py b/erpnext/patches/v8_10/add_due_date_to_gle.py index 047c883f0f1..ec5e003cb9c 100644 --- a/erpnext/patches/v8_10/add_due_date_to_gle.py +++ b/erpnext/patches/v8_10/add_due_date_to_gle.py @@ -4,4 +4,4 @@ import frappe def execute(): if not frappe.db.has_column("GL Entry", "due_date"): - frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE DEFAULT NULL") + frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE NULL") diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py index c5a6fb19428..b507b2aabb7 100644 --- a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py +++ b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py @@ -4,6 +4,6 @@ import frappe def execute(): if not frappe.db.has_column("Customer", "payment_terms"): - frappe.db.sql("ALTER TABLE `tabCustomer` ADD COLUMN `payment_terms` DATE DEFAULT NULL") + frappe.db.sql("ALTER TABLE `tabCustomer` ADD COLUMN `payment_terms` VARCHAR(140) NULL") if not frappe.db.has_column("Supplier", "payment_terms"): - frappe.db.sql("ALTER TABLE `tabSupplier` ADD COLUMN `payment_terms` DATE DEFAULT NULL") + frappe.db.sql("ALTER TABLE `tabSupplier` ADD COLUMN `payment_terms` VARCHAR(140) NULL") diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py index c4376fa9741..dc52c89f45e 100644 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -55,7 +55,7 @@ def execute(): value_query_str = " ".join(payment_terms) cond_query_str = " ELSE `payment_terms` END WHERE " - if customers: + if suppliers: frappe.db.sql( begin_query_str + value_query_str + cond_query_str + '`supplier_name` IN %s', (suppliers,) From 2fdb857fed99ed3265a05d01416562eb3cd2731c Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 5 Sep 2017 00:21:54 +0100 Subject: [PATCH 048/164] fix due date disable bug --- erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js | 3 ++- erpnext/accounts/doctype/sales_invoice/sales_invoice.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 8d4d2d4284a..36ca5287e9e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -379,7 +379,8 @@ frappe.ui.form.on("Purchase Invoice", { }, disable_due_date: function() { - const disable = !cur_frm.doc.payment_terms_template && cur_frm.doc.payment_schedule.length == 0; + const disable = cur_frm.doc.payment_terms_template || ( + cur_frm.doc.payment_schedule && cur_frm.doc.payment_schedule.length == 0); cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); }, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 2c11e1701ec..5432b4c4500 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -571,7 +571,8 @@ frappe.ui.form.on("Sales Invoice", { }, disable_due_date: function() { - const disable = !cur_frm.doc.payment_terms_template && cur_frm.doc.payment_schedule.length == 0; + const disable = cur_frm.doc.payment_terms_template || ( + cur_frm.doc.payment_schedule && cur_frm.doc.payment_schedule.length == 0); cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); }, From b8ddae13ba4c975aa2a3a0e750aacf5f4b382164 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 5 Sep 2017 00:23:24 +0100 Subject: [PATCH 049/164] fix patches --- erpnext/patches.txt | 2 ++ .../change_default_customer_credit_days.py | 24 ++++++++++++------- ...hange_default_supplier_type_credit_days.py | 8 +++---- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index a6df2046991..180d2f8a86c 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -439,3 +439,5 @@ erpnext.patches.v8_10.add_due_date_to_gle erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si erpnext.patches.v8_10.add_payment_terms_field_to_supplier erpnext.patches.v8_10.change_default_customer_credit_days +erpnext.patches.v8_10.add_payment_terms_field_to_supplier_type +erpnext.patches.v8_10.change_default_supplier_type_credit_days diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py index dc52c89f45e..a9197137418 100644 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -3,6 +3,10 @@ import frappe def execute(): + frappe.reload_doc("accounts", "doctype", "payment_term") + frappe.reload_doc("accounts", "doctype", "payment_terms_template_detail") + frappe.reload_doc("accounts", "doctype", "payment_terms_template") + payment_terms = [] customers = [] suppliers = [] @@ -14,9 +18,9 @@ def execute(): credit_records = ((record[0], record[1], record[2]) for record in credit_days) for days, based_on, customer_name in credit_records: payment_term = make_payment_term(days, based_on) - payment_terms.append('WHEN `customer_name`="%s" THEN "%s"' % (customer_name, payment_term.payment_term_name)) + template = make_template(payment_term) + payment_terms.append('WHEN `customer_name`="%s" THEN "%s"' % (customer_name, template.template_name)) customers.append(customer_name) - make_template(payment_term) begin_query_str = "UPDATE `tabCustomer` SET `payment_terms` = CASE " value_query_str = " ".join(payment_terms) @@ -38,17 +42,17 @@ def execute(): credit_records = ((record[0], record[1], record[2]) for record in credit_days) for days, based_on, supplier_name in credit_records: if based_on == "Fixed Days": - pyt_term_name = 'N{0}'.format(days) + pyt_template_name = 'Default Payment Term - N{0}'.format(days) else: - pyt_term_name = 'EO2M' + pyt_template_name = 'Default Payment Term - EO2M' - if not frappe.db.exists("Payment Term", pyt_term_name): + if not frappe.db.exists("Payment Term Template", pyt_template_name): payment_term = make_payment_term(days, based_on) - make_template(payment_term) + template = make_template(payment_term) else: - payment_term = frappe.get_doc("Payment Term", pyt_term_name) + template = frappe.get_doc("Payment Term Template", pyt_template_name) - payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_name, payment_term.payment_term_name)) + payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_name, template.template_name)) suppliers.append(supplier_name) begin_query_str = "UPDATE `tabSupplier` SET `payment_terms` = CASE " @@ -73,9 +77,11 @@ def make_template(payment_term): template = frappe.new_doc('Payment Terms Template') template.template_name = 'Default Payment Term - {0}'.format(payment_term.payment_term_name) - template.terms = [doc] + template.append('terms', doc) template.save() + return template + def make_payment_term(days, based_on): based_on_map = { diff --git a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py b/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py index a6696485356..448bdbe15d8 100644 --- a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py +++ b/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py @@ -1,5 +1,5 @@ import frappe -from patches.v8_10.change_default_customer_credit_days import make_payment_term, make_template +from erpnext.patches.v8_10.change_default_customer_credit_days import make_payment_term, make_template def execute(): @@ -25,15 +25,15 @@ def execute(): else: payment_term = frappe.get_doc("Payment Term", pyt_term_name) - payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_type, payment_term.payment_term_name)) + payment_terms.append('WHEN `supplier_type`="%s" THEN "%s"' % (supplier_type, payment_term.payment_term_name)) supplier_types.append(supplier_type) - begin_query_str = "UPDATE `tabSupplier` SET `payment_terms` = CASE " + begin_query_str = "UPDATE `tabSupplier Type` SET `payment_terms` = CASE " value_query_str = " ".join(payment_terms) cond_query_str = " ELSE `payment_terms` END WHERE " if supplier_types: frappe.db.sql( - begin_query_str + value_query_str + cond_query_str + '`supplier_name` IN %s', + begin_query_str + value_query_str + cond_query_str + '`supplier_type` IN %s', (supplier_types,) ) From ed86efb1fddaf11735b3d9a16d5db210eab5813d Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 5 Sep 2017 01:15:31 +0100 Subject: [PATCH 050/164] modify `get_due_date` to check Supplier Type if needed --- erpnext/accounts/party.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 32c7e3e8d6d..0c790d6369d 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -271,6 +271,11 @@ def get_due_date(posting_date, party_type, party): template_name = get_pyt_term_template(party, party_type) if template_name: due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d") + else: + if party_type == "Supplier": + supplier_type = frappe.db.get_value(party_type, party, fieldname="supplier_type") + template_name = frappe.db.get_value("Supplier Type", supplier_type, fieldname="payment_terms") + due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d") return due_date From 743ba690dda5c227f48eaf4b1f42599adb0b350b Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 5 Sep 2017 01:17:14 +0100 Subject: [PATCH 051/164] more test cases for Supplier --- .../buying/doctype/supplier/test_supplier.py | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index 2af67592602..c52b9a0d5c2 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -38,25 +38,20 @@ class TestSupplier(unittest.TestCase): frappe.db.set_value("Supplier", "_Test Supplier With Template 1", "payment_terms", "") # Set credit limit for the supplier type instead of supplier and evaluate the due date - # frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", - # "Fixed Days") - # frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days", 10) - # - # due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") - # self.assertEqual(due_date, "2016-02-01") - # - # # Set credit limit for the supplier type instead of supplier and evaluate the due date - # # based on Last day of next month - # frappe.db.set_value("Supplier", "_Test Supplier Type", "credit_days", 0) - # frappe.db.set_value("Supplier Type", "_Test Supplier Type", "credit_days_based_on", - # "Last Day of the Next Month") - # - # # Leap year - # due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier", "_Test Company") - # self.assertEqual(due_date, "2016-02-29") + frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "_Test Payment Term Template 3") + + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2016-02-21") + + # Set credit limit for the supplier type instead of supplier and evaluate the due date + frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "_Test Payment Term Template 1") + + # Leap year + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2016-02-29") # # Non Leap year - # due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") - # self.assertEqual(due_date, "2017-02-28") + due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier With Template 1") + self.assertEqual(due_date, "2017-02-28") def test_supplier_disabled(self): make_test_records("Item") From a496c4358175cc7dae3978db8273d30932349026 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 5 Sep 2017 17:36:21 +0100 Subject: [PATCH 052/164] fix test --- erpnext/accounts/party.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 0c790d6369d..08571dd89e5 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -275,6 +275,7 @@ def get_due_date(posting_date, party_type, party): if party_type == "Supplier": supplier_type = frappe.db.get_value(party_type, party, fieldname="supplier_type") template_name = frappe.db.get_value("Supplier Type", supplier_type, fieldname="payment_terms") + print("template name:", template_name) due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d") return due_date From e5973e45f13cda1045d23fad3e8794aa9927f820 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 5 Sep 2017 18:11:58 +0100 Subject: [PATCH 053/164] fix test --- erpnext/accounts/party.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 08571dd89e5..f1c7c6c7c6c 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -275,8 +275,8 @@ def get_due_date(posting_date, party_type, party): if party_type == "Supplier": supplier_type = frappe.db.get_value(party_type, party, fieldname="supplier_type") template_name = frappe.db.get_value("Supplier Type", supplier_type, fieldname="payment_terms") - print("template name:", template_name) - due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d") + if template_name: + due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d") return due_date From 98cca8ee18d51c70704055d92346f45bd5c7821b Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 6 Sep 2017 06:11:58 +0100 Subject: [PATCH 054/164] remove unused imports --- erpnext/buying/doctype/supplier/test_supplier.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index c52b9a0d5c2..e54cc3adc92 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -7,7 +7,6 @@ import frappe, unittest from erpnext.accounts.party import get_due_date from erpnext.exceptions import PartyDisabled from frappe.test_runner import make_test_records -from frappe.utils import add_days, add_months, get_last_day test_dependencies = ['Payment Term', 'Payment Terms Template'] test_records = frappe.get_test_records('Supplier') From 98fd5401ff7e3cb5bcbcdf0cfcffafc218e09f1e Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 6 Sep 2017 08:47:14 +0100 Subject: [PATCH 055/164] test customer --- .../selling/doctype/customer/test_customer.py | 32 ++++++++++++++++++- .../doctype/customer/test_records.json | 5 ++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index 40ed6f98fe1..45546e348aa 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe import unittest +from erpnext.accounts.party import get_due_date from frappe.test_runner import make_test_records from erpnext.exceptions import PartyFrozen, PartyDisabled from frappe.utils import flt @@ -13,7 +14,7 @@ from erpnext.selling.doctype.customer.customer import get_credit_limit, get_cust from erpnext.tests.utils import create_test_contact_and_address test_ignore = ["Price List"] - +test_dependencies = ['Payment Term', 'Payment Terms Template'] test_records = frappe.get_test_records('Customer') class TestCustomer(unittest.TestCase): @@ -181,6 +182,35 @@ class TestCustomer(unittest.TestCase): customer.credit_limit = flt(outstanding_amt - 100) self.assertRaises(frappe.ValidationError, customer.save) + def test_customer_payment_terms(self): + frappe.db.set_value( + "Customer", "_Test Customer With Template", "payment_terms", "_Test Payment Term Template 3") + + due_date = get_due_date("2016-01-22", "Customer", "_Test Customer With Template") + self.assertEqual(due_date, "2016-02-21") + + due_date = get_due_date("2017-01-22", "Customer", "_Test Customer With Template") + self.assertEqual(due_date, "2017-02-21") + + frappe.db.set_value( + "Customer", "_Test Customer With Template", "payment_terms", "_Test Payment Term Template 1") + + due_date = get_due_date("2016-01-22", "Customer", "_Test Customer With Template") + self.assertEqual(due_date, "2016-02-29") + + due_date = get_due_date("2017-01-22", "Customer", "_Test Customer With Template") + self.assertEqual(due_date, "2017-02-28") + + frappe.db.set_value("Customer", "_Test Customer With Template", "payment_terms", "") + + # No default payment term template attached + due_date = get_due_date("2016-01-22", "Customer", "_Test Customer") + self.assertEqual(due_date, "2016-01-22") + + due_date = get_due_date("2017-01-22", "Customer", "_Test Customer") + self.assertEqual(due_date, "2017-01-22") + + def get_customer_dict(customer_name): return { "customer_group": "_Test Customer Group", diff --git a/erpnext/selling/doctype/customer/test_records.json b/erpnext/selling/doctype/customer/test_records.json index 43d6beb0cbf..b9637ee17da 100644 --- a/erpnext/selling/doctype/customer/test_records.json +++ b/erpnext/selling/doctype/customer/test_records.json @@ -1,11 +1,10 @@ [ { "customer_group": "_Test Customer Group", - "customer_name": "_Test Customer P", + "customer_name": "_Test Customer With Template", "customer_type": "Individual", "doctype": "Customer", - "territory": "_Test Territory", - "credit_days_based_on": "Fixed Days" + "territory": "_Test Territory" }, { "customer_group": "_Test Customer Group", From 794001df504d83cd0c43dfdc98833cea5833f621 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 6 Sep 2017 09:16:11 +0100 Subject: [PATCH 056/164] more test cases in Supplier --- erpnext/buying/doctype/supplier/test_supplier.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index e54cc3adc92..16dda5c5ffc 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -42,7 +42,7 @@ class TestSupplier(unittest.TestCase): due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier With Template 1") self.assertEqual(due_date, "2016-02-21") - # Set credit limit for the supplier type instead of supplier and evaluate the due date + # Payment terms for Supplier Type instead of supplier and evaluate the due date frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "_Test Payment Term Template 1") # Leap year @@ -52,6 +52,16 @@ class TestSupplier(unittest.TestCase): due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier With Template 1") self.assertEqual(due_date, "2017-02-28") + # Supplier with no default Payment Terms Template + frappe.db.set_value("Supplier Type", "_Test Supplier Type", "payment_terms", "") + frappe.db.set_value("Supplier", "_Test Supplier", "payment_terms", "") + + due_date = get_due_date("2016-01-22", "Supplier", "_Test Supplier") + self.assertEqual(due_date, "2016-01-22") + # # Non Leap year + due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier") + self.assertEqual(due_date, "2017-01-22") + def test_supplier_disabled(self): make_test_records("Item") From 9e32387aa7d33f44a582a2c0215e4b346114353b Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 6 Sep 2017 09:24:44 +0100 Subject: [PATCH 057/164] fix customer test records --- erpnext/selling/doctype/customer/test_records.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/selling/doctype/customer/test_records.json b/erpnext/selling/doctype/customer/test_records.json index b9637ee17da..a012c1ba38d 100644 --- a/erpnext/selling/doctype/customer/test_records.json +++ b/erpnext/selling/doctype/customer/test_records.json @@ -6,6 +6,13 @@ "doctype": "Customer", "territory": "_Test Territory" }, + { + "customer_group": "_Test Customer Group", + "customer_name": "_Test Customer P", + "customer_type": "Individual", + "doctype": "Customer", + "territory": "_Test Territory" + }, { "customer_group": "_Test Customer Group", "customer_name": "_Test Customer", From e7da1c55008eddc9a55bcf3141f597be045f83f5 Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 6 Sep 2017 12:36:45 +0100 Subject: [PATCH 058/164] refactor: DRY for disable due date logic --- .../purchase_invoice/purchase_invoice.js | 18 ----------- .../doctype/sales_invoice/sales_invoice.js | 19 ------------ erpnext/public/js/controllers/accounts.js | 30 +++++++++++++++++-- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 36ca5287e9e..0850b3dded4 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -373,22 +373,4 @@ frappe.ui.form.on("Purchase Invoice", { } }) -frappe.ui.form.on("Purchase Invoice", { - payment_terms_template: function() { - cur_frm.trigger("disable_due_date"); - }, - disable_due_date: function() { - const disable = cur_frm.doc.payment_terms_template || ( - cur_frm.doc.payment_schedule && cur_frm.doc.payment_schedule.length == 0); - cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); - }, - -}); - -frappe.ui.form.on("Payment Schedule", { - payment_schedule_remove: function() { - cur_frm.trigger("disable_due_date"); - }, - -}); \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 5432b4c4500..4b917ce27b4 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -565,22 +565,3 @@ var calculate_total_billing_amount = function(frm) { refresh_field('total_billing_amount') } -frappe.ui.form.on("Sales Invoice", { - payment_terms_template: function() { - cur_frm.trigger("disable_due_date"); - }, - - disable_due_date: function() { - const disable = cur_frm.doc.payment_terms_template || ( - cur_frm.doc.payment_schedule && cur_frm.doc.payment_schedule.length == 0); - cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); - }, - -}); - -frappe.ui.form.on("Payment Schedule", { - payment_schedule_remove: function() { - cur_frm.trigger("disable_due_date"); - }, - -}); \ No newline at end of file diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js index abd5566243f..46503456482 100644 --- a/erpnext/public/js/controllers/accounts.js +++ b/erpnext/public/js/controllers/accounts.js @@ -52,7 +52,14 @@ frappe.ui.form.on(cur_frm.doctype, { }, taxes_on_form_rendered: function(frm) { erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm.open_grid_row()); - } + }, + + disable_due_date: function() { + const disable = cur_frm.doc.payment_terms_template || ( + cur_frm.doc.payment_schedule && cur_frm.doc.payment_schedule.length != 0); + cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); + }, + }); frappe.ui.form.on('Sales Invoice Payment', { @@ -62,15 +69,32 @@ frappe.ui.form.on('Sales Invoice Payment', { frappe.model.set_value(cdt, cdn, 'account', account) }) } -}) +}); + +frappe.ui.form.on("Sales Invoice", { + payment_terms_template: function() { + cur_frm.trigger("disable_due_date"); + } +}); frappe.ui.form.on('Purchase Invoice', { mode_of_payment: function(frm) { get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){ frm.set_value('cash_bank_account', account); }) + }, + + payment_terms_template: function() { + cur_frm.trigger("disable_due_date"); } -}) +}); + +frappe.ui.form.on("Payment Schedule", { + payment_schedule_remove: function() { + cur_frm.trigger("disable_due_date"); + }, + +}); frappe.ui.form.on('Payment Entry', { mode_of_payment: function(frm) { From dba6f841e64e85c73b13228a903cbbf20d6e6c72 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 06:51:07 +0100 Subject: [PATCH 059/164] refactor: DRY for due date disabled --- erpnext/public/js/controllers/accounts.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js index 46503456482..f38084fa68e 100644 --- a/erpnext/public/js/controllers/accounts.js +++ b/erpnext/public/js/controllers/accounts.js @@ -52,14 +52,7 @@ frappe.ui.form.on(cur_frm.doctype, { }, taxes_on_form_rendered: function(frm) { erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm.open_grid_row()); - }, - - disable_due_date: function() { - const disable = cur_frm.doc.payment_terms_template || ( - cur_frm.doc.payment_schedule && cur_frm.doc.payment_schedule.length != 0); - cur_frm.set_df_property("due_date", "read_only", disable ? 1 : 0); - }, - + } }); frappe.ui.form.on('Sales Invoice Payment', { From 32aa7c1e6873d07f0695095c3655f115ab0f8eb4 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 06:52:15 +0100 Subject: [PATCH 060/164] Automatically set payment schedule if not specified - fix failing test cases - fix failing tests for recurring documents - others --- erpnext/accounts/party.py | 2 +- erpnext/controllers/accounts_controller.py | 31 +++++++++++++--------- erpnext/controllers/recurring_document.py | 5 +++- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index f1c7c6c7c6c..a1b737dffb3 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -302,7 +302,7 @@ def get_due_date_from_template(template_name, posting_date): return due_date -def validate_due_date(posting_date, due_date, party_type, party, company): +def validate_due_date(posting_date, due_date, party_type, party): if getdate(due_date) < getdate(posting_date): frappe.throw(_("Due Date cannot be before Posting Date")) else: diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 25ec8637f53..d368d5a5ea6 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -47,6 +47,9 @@ class AccountsController(TransactionBase): if self.get("payment_schedule"): self.set_due_date() self.validate_payment_schedule() + else: + self.set_payment_schedule() + self.set_due_date() self.validate_due_date() self.validate_advance_entries() @@ -125,9 +128,9 @@ class AccountsController(TransactionBase): if not self.due_date: frappe.throw(_("Due Date is mandatory")) - validate_due_date(self.posting_date, self.due_date, "Customer", self.customer, self.company) + validate_due_date(self.posting_date, self.due_date, "Customer", self.customer) elif self.doctype == "Purchase Invoice": - validate_due_date(self.posting_date, self.due_date, "Supplier", self.supplier, self.company) + validate_due_date(self.posting_date, self.due_date, "Supplier", self.supplier) def set_price_list_currency(self, buying_or_selling): if self.meta.get_field("posting_date"): @@ -617,16 +620,13 @@ class AccountsController(TransactionBase): for item in duplicate_list: self.remove(item) - def _set_payment_schedule(self): - if not self.get("payment_schedule"): - if self.due_date: - self.append("payment_schedule", { - "due_date": self.due_date, - "invoice_portion": 100, - "payment_amount": self.grand_total - }) - else: - self.due_date = max([d.due_date for d in self.get("payment_schedule")]) + def set_payment_schedule(self): + due_date = self.due_date or get_due_date(self.posting_date) + self.append("payment_schedule", { + "due_date": due_date, + "invoice_portion": 100, + "payment_amount": self.grand_total + }) def set_due_date(self): self.due_date = max([d.due_date for d in self.get("payment_schedule")]) @@ -643,7 +643,12 @@ class AccountsController(TransactionBase): total += flt(d.payment_amount) if total != self.grand_total: - frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) + # Try to recover if the Payment Term is a very simple one. + # If there is just one Payment Term and the invoice portion is 100: + if len(self.payment_schedule) == 1 and self.payment_schedule[0].invoice_portion == 100: + self.payment_schedule[0].update({'payment_amount': self.grand_total}) + else: + frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) @frappe.whitelist() diff --git a/erpnext/controllers/recurring_document.py b/erpnext/controllers/recurring_document.py index 713e9bac2f1..6919434bd0c 100644 --- a/erpnext/controllers/recurring_document.py +++ b/erpnext/controllers/recurring_document.py @@ -9,6 +9,7 @@ from frappe.utils import cint, cstr, getdate, nowdate, \ from frappe import _, msgprint, throw + month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12} date_field_map = { "Sales Order": "transaction_date", @@ -73,6 +74,7 @@ def manage_recurring_documents(doctype, next_date=None, commit=True): frappe.throw(exception_message) def make_new_document(reference_doc, date_field, posting_date): + from erpnext.controllers.accounts_controller import get_payment_terms new_document = frappe.copy_doc(reference_doc, ignore_no_copy=False) mcount = month_map[reference_doc.recurring_type] @@ -90,7 +92,8 @@ def make_new_document(reference_doc, date_field, posting_date): date_field: posting_date, "from_date": from_date, "to_date": to_date, - "next_date": get_next_date(reference_doc.next_date, mcount,cint(reference_doc.repeat_on_day_of_month)) + "next_date": get_next_date(reference_doc.next_date, mcount,cint(reference_doc.repeat_on_day_of_month)), + "payment_schedule": get_payment_terms("_Test Payment Term Template 3", posting_date, new_document.grand_total) }) if new_document.meta.get_field('set_posting_time'): From 788de8001c7fe3b92e33fb8cd8318330ef503b1d Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 11:30:06 +0100 Subject: [PATCH 061/164] more tests --- .../purchase_invoice/test_purchase_invoice.py | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index f189bf849af..da91be28569 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -10,11 +10,12 @@ from frappe.utils import cint, flt, today, nowdate, getdate, add_days import frappe.defaults from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory, \ test_records as pr_test_records +from erpnext.controllers.accounts_controller import get_payment_terms from erpnext.exceptions import InvalidCurrency from erpnext.stock.doctype.stock_entry.test_stock_entry import get_qty_after_transaction from erpnext.accounts.doctype.account.test_account import get_inventory_account -test_dependencies = ["Item", "Cost Center"] +test_dependencies = ["Item", "Cost Center", "Payment Term", "Payment Terms Template"] test_ignore = ["Serial No"] class TestPurchaseInvoice(unittest.TestCase): @@ -256,6 +257,55 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertFalse(frappe.db.sql("""select name from `tabJournal Entry Account` where reference_type='Purchase Invoice' and reference_name=%s""", pi.name)) + def test_invoice_with_advance_and_multi_payment_terms(self): + from erpnext.accounts.doctype.journal_entry.test_journal_entry \ + import test_records as jv_test_records + + jv = frappe.copy_doc(jv_test_records[1]) + jv.insert() + jv.submit() + + pi = frappe.copy_doc(test_records[0]) + + pi.append("advances", { + "reference_type": "Journal Entry", + "reference_name": jv.name, + "reference_row": jv.get("accounts")[0].name, + "advance_amount": 400, + "allocated_amount": 300, + "remarks": jv.remark + }) + pi.insert() + + pi.update( + {"payment_schedule": get_payment_terms("_Test Payment Term Template", pi.posting_date, pi.grand_total)} + ) + + pi.save() + pi.submit() + self.assertEqual(pi.payment_schedule[0].payment_amount, 756.15) + self.assertEqual(pi.payment_schedule[0].due_date, pi.posting_date) + self.assertEqual(pi.payment_schedule[1].payment_amount, 756.15) + self.assertEqual(pi.payment_schedule[1].due_date, add_days(pi.posting_date, 30)) + + pi.load_from_db() + + self.assertTrue( + frappe.db.sql( + "select name from `tabJournal Entry Account` where reference_type='Purchase Invoice' and " + "reference_name=%s and debit_in_account_currency=300", pi.name) + ) + + self.assertEqual(pi.outstanding_amount, 1212.30) + + pi.cancel() + + self.assertFalse( + frappe.db.sql( + "select name from `tabJournal Entry Account` where reference_type='Purchase Invoice' and " + "reference_name=%s", pi.name) + ) + def test_recurring_invoice(self): from erpnext.controllers.tests.test_recurring_document import test_recurring_document test_recurring_document(self, test_records) From 67f3d854bc0374af890fd35fdd1ba00fa95047be Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 12:22:48 +0100 Subject: [PATCH 062/164] test for quotation --- .../doctype/quotation/test_quotation.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index d7d84c7bd67..457ba1a359a 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe from frappe.utils import flt, add_days, nowdate, add_months +from erpnext.controllers.accounts_controller import get_payment_terms import unittest test_dependencies = ["Product Bundle"] @@ -33,6 +34,40 @@ class TestQuotation(unittest.TestCase): sales_order.transaction_date = nowdate() sales_order.insert() + def test_make_sales_order_with_terms(self): + from erpnext.selling.doctype.quotation.quotation import make_sales_order + + quotation = frappe.copy_doc(test_records[0]) + quotation.transaction_date = nowdate() + quotation.valid_till = add_months(quotation.transaction_date, 1) + quotation.insert() + quotation.update( + {"payment_schedule": get_payment_terms( + "_Test Payment Term Template", quotation.transaction_date, quotation.grand_total + )} + ) + + self.assertRaises(frappe.ValidationError, make_sales_order, quotation.name) + quotation.save() + quotation.submit() + self.assertEqual(quotation.payment_schedule[0].payment_amount, 8906.25) + self.assertEqual(quotation.payment_schedule[0].due_date, quotation.transaction_date) + self.assertEqual(quotation.payment_schedule[1].payment_amount, 8906.25) + self.assertEqual(quotation.payment_schedule[1].due_date, add_days(quotation.transaction_date, 30)) + + sales_order = make_sales_order(quotation.name) + + self.assertEquals(sales_order.doctype, "Sales Order") + self.assertEquals(len(sales_order.get("items")), 1) + self.assertEquals(sales_order.get("items")[0].doctype, "Sales Order Item") + self.assertEquals(sales_order.get("items")[0].prevdoc_docname, quotation.name) + self.assertEquals(sales_order.customer, "_Test Customer") + + sales_order.delivery_date = "2014-01-01" + sales_order.naming_series = "_T-Quotation-" + sales_order.transaction_date = nowdate() + sales_order.insert() + def test_valid_till(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order From b0f6b068ef01193355c8be6d1b4126b7e2c5d4dc Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 13:50:46 +0100 Subject: [PATCH 063/164] remove test based on deleted `recurring_document.py` --- .../doctype/purchase_invoice/test_purchase_invoice.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index da91be28569..60f9b3fd13b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -306,10 +306,6 @@ class TestPurchaseInvoice(unittest.TestCase): "reference_name=%s", pi.name) ) - def test_recurring_invoice(self): - from erpnext.controllers.tests.test_recurring_document import test_recurring_document - test_recurring_document(self, test_records) - def test_total_purchase_cost_for_project(self): existing_purchase_cost = frappe.db.sql("""select sum(base_net_amount) from `tabPurchase Invoice Item` where project = '_Test Project' and docstatus=1""") From 9085a5e52dc7804a7d4396d40d49279ca41dd384 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 14:31:33 +0100 Subject: [PATCH 064/164] more test cases for quotation, purchase/sales order --- .../purchase_order/test_purchase_order.py | 31 +++++++++++++++++- .../doctype/quotation/test_quotation.py | 6 +++- .../doctype/sales_order/test_sales_order.py | 32 ++++++++++++++++++- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 17786aa443a..1bfc9cb68c2 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -5,8 +5,9 @@ from __future__ import unicode_literals import unittest import frappe import frappe.defaults -from frappe.utils import flt, add_days, nowdate +from frappe.utils import flt, add_days, nowdate, DATE_FORMAT from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt, make_purchase_invoice +from erpnext.controllers.accounts_controller import get_payment_terms class TestPurchaseOrder(unittest.TestCase): def test_make_purchase_receipt(self): @@ -83,6 +84,34 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEquals(pi.doctype, "Purchase Invoice") self.assertEquals(len(pi.get("items", [])), 1) + def test_make_purchase_invoice_with_terms(self): + po = create_purchase_order(do_not_submit=True) + + self.assertRaises(frappe.ValidationError, make_purchase_invoice, po.name) + + po.update( + {"payment_schedule": get_payment_terms( + "_Test Payment Term Template", po.transaction_date, po.grand_total + )} + ) + + po.save() + po.submit() + + self.assertEqual(po.payment_schedule[0].payment_amount, 2500.0) + self.assertEqual(po.payment_schedule[0].due_date, po.transaction_date) + self.assertEqual(po.payment_schedule[1].payment_amount, 2500.0) + self.assertEqual(po.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) + pi = make_purchase_invoice(po.name) + + self.assertEquals(pi.doctype, "Purchase Invoice") + self.assertEquals(len(pi.get("items", [])), 1) + + self.assertEqual(pi.payment_schedule[0].payment_amount, 2500.0) + self.assertEqual(pi.payment_schedule[0].due_date.strftime(DATE_FORMAT), po.transaction_date) + self.assertEqual(pi.payment_schedule[1].payment_amount, 2500.0) + self.assertEqual(pi.payment_schedule[1].due_date.strftime(DATE_FORMAT), add_days(po.transaction_date, 30)) + def test_subcontracting(self): po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes") self.assertEquals(len(po.get("supplied_items")), 2) diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index 457ba1a359a..f40a4ca86a7 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import flt, add_days, nowdate, add_months +from frappe.utils import flt, add_days, nowdate, add_months, DATE_FORMAT from erpnext.controllers.accounts_controller import get_payment_terms import unittest @@ -62,6 +62,10 @@ class TestQuotation(unittest.TestCase): self.assertEquals(sales_order.get("items")[0].doctype, "Sales Order Item") self.assertEquals(sales_order.get("items")[0].prevdoc_docname, quotation.name) self.assertEquals(sales_order.customer, "_Test Customer") + self.assertEqual(sales_order.payment_schedule[0].payment_amount, 8906.25) + self.assertEqual(sales_order.payment_schedule[0].due_date.strftime(DATE_FORMAT), quotation.transaction_date) + self.assertEqual(sales_order.payment_schedule[1].payment_amount, 8906.25) + self.assertEqual(sales_order.payment_schedule[1].due_date.strftime(DATE_FORMAT), add_days(quotation.transaction_date, 30)) sales_order.delivery_date = "2014-01-01" sales_order.naming_series = "_T-Quotation-" diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 7c0d7f9dcaf..ff6166d86d2 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2,13 +2,14 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals import frappe -from frappe.utils import flt, add_days +from frappe.utils import flt, add_days, DATE_FORMAT import frappe.permissions import unittest from erpnext.stock.doctype.item.test_item import get_total_projected_qty from erpnext.selling.doctype.sales_order.sales_order \ import make_material_request, make_delivery_note, make_sales_invoice, WarehouseRequired from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.controllers.accounts_controller import get_payment_terms from frappe.tests.test_permissions import set_user_permission_doctypes class TestSalesOrder(unittest.TestCase): @@ -58,6 +59,35 @@ class TestSalesOrder(unittest.TestCase): si1 = make_sales_invoice(so.name) self.assertEquals(len(si1.get("items")), 0) + def test_make_sales_invoice_with_terms(self): + so = make_sales_order(do_not_submit=True) + + self.assertRaises(frappe.ValidationError, make_sales_invoice, so.name) + + so.update( + {"payment_schedule": get_payment_terms( + "_Test Payment Term Template", so.transaction_date, so.grand_total + )} + ) + + so.save() + so.submit() + si = make_sales_invoice(so.name) + + self.assertEqual(si.payment_schedule[0].payment_amount, 500.0) + self.assertEqual(si.payment_schedule[0].due_date.strftime(DATE_FORMAT), so.transaction_date) + self.assertEqual(si.payment_schedule[1].payment_amount, 500.0) + self.assertEqual(si.payment_schedule[1].due_date.strftime(DATE_FORMAT), add_days(so.transaction_date, 30)) + + self.assertEquals(len(si.get("items")), len(so.get("items"))) + self.assertEquals(len(si.get("items")), 1) + + si.insert() + si.submit() + + si1 = make_sales_invoice(so.name) + self.assertEquals(len(si1.get("items")), 0) + def test_update_qty(self): so = make_sales_order() From 2d3a575f296a1103749ac112bad104e11199496f Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 14:50:20 +0100 Subject: [PATCH 065/164] more test cases for purchase/sales invoice --- .../doctype/purchase_invoice/test_purchase_invoice.py | 6 ++++++ .../accounts/doctype/sales_invoice/test_sales_invoice.py | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 60f9b3fd13b..59e64aa4d07 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -62,6 +62,12 @@ class TestPurchaseInvoice(unittest.TestCase): set_perpetual_inventory(0, pi.company) + def test_terms_added_after_save(self): + pi = frappe.copy_doc(test_records[1]) + pi.insert() + self.assertTrue(pi.payment_schedule) + self.assertEqual(pi.payment_schedule[0].due_date, pi.due_date) + def test_payment_entry_unlink_against_purchase_invoice(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry unlink_payment_on_cancel_of_invoice(0) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 56181fc8c6e..44cc8d774ec 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -58,6 +58,13 @@ class TestSalesInvoice(unittest.TestCase): self.assertRaises(frappe.CannotChangeConstantError, si.save) + def test_add_terms_after_save(self): + si = frappe.copy_doc(test_records[2]) + si.insert() + + self.assertTrue(si.payment_schedule) + self.assertEqual(si.payment_schedule[0].due_date, si.due_date) + def test_sales_invoice_calculation_base_currency(self): si = frappe.copy_doc(test_records[2]) si.insert() From 4f4148b0dae5678e34d0d3285997e2b3f4d4f307 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 7 Sep 2017 18:49:10 +0100 Subject: [PATCH 066/164] make payment_schedule field no-copy --- .../purchase_invoice/purchase_invoice.json | 69 ++----------------- .../doctype/sales_invoice/sales_invoice.json | 69 ++----------------- .../purchase_order/purchase_order.json | 69 ++----------------- .../selling/doctype/quotation/quotation.json | 67 +----------------- .../doctype/sales_order/sales_order.json | 67 +----------------- 5 files changed, 18 insertions(+), 323 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 5051710298c..e27fdb18dde 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2804,7 +2804,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -3440,67 +3440,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -3511,7 +3450,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3950,8 +3889,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-31 11:22:47.074420", - "modified_by": "Administrator", + "modified": "2017-09-07 18:40:20.386968", + "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", "name_case": "Title Case", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index ba6421937f6..6e262df15e9 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2766,7 +2766,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -4273,67 +4273,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -4344,7 +4283,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -4847,8 +4786,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-31 11:23:08.675028", - "modified_by": "Administrator", + "modified": "2017-09-07 18:41:07.601012", + "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", "name_case": "Title Case", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 750e65f0c8b..808d53e6b8f 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2366,7 +2366,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -2948,67 +2948,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -3019,7 +2958,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3488,8 +3427,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 11:22:30.190589", - "modified_by": "Administrator", + "modified": "2017-09-07 18:42:33.555456", + "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", "owner": "Administrator", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 7b2bf05c61c..f4a3a3d5b21 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2169,7 +2169,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -2431,67 +2431,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -2788,8 +2727,8 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-08-31 11:22:15.268846", - "modified_by": "Administrator", + "modified": "2017-09-07 18:43:10.487736", + "modified_by": "Administrator", "module": "Selling", "name": "Quotation", "owner": "Administrator", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 6ed1176a8bf..8e9628cdf72 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2347,7 +2347,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -3271,67 +3271,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 0, - "options": "Subscription", - "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, @@ -3342,7 +3281,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3812,7 +3751,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 11:21:36.332326", + "modified": "2017-09-07 18:42:01.386972", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", From fbd895d781b2718b35775fa36094c594c2b7ff89 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 8 Sep 2017 10:06:46 +0100 Subject: [PATCH 067/164] Revert "make payment_schedule field no-copy" This reverts commit 4f4148b0dae5678e34d0d3285997e2b3f4d4f307. --- .../purchase_invoice/purchase_invoice.json | 69 +++++++++++++++++-- .../doctype/sales_invoice/sales_invoice.json | 69 +++++++++++++++++-- .../purchase_order/purchase_order.json | 69 +++++++++++++++++-- .../selling/doctype/quotation/quotation.json | 67 +++++++++++++++++- .../doctype/sales_order/sales_order.json | 67 +++++++++++++++++- 5 files changed, 323 insertions(+), 18 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index e27fdb18dde..5051710298c 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2804,7 +2804,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 1, + "no_copy": 0, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -3440,6 +3440,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -3450,7 +3511,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3889,8 +3950,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-09-07 18:40:20.386968", - "modified_by": "Administrator", + "modified": "2017-08-31 11:22:47.074420", + "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", "name_case": "Title Case", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 6e262df15e9..ba6421937f6 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2766,7 +2766,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 1, + "no_copy": 0, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -4273,6 +4273,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -4283,7 +4344,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -4786,8 +4847,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-09-07 18:41:07.601012", - "modified_by": "Administrator", + "modified": "2017-08-31 11:23:08.675028", + "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", "name_case": "Title Case", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 808d53e6b8f..750e65f0c8b 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2366,7 +2366,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 1, + "no_copy": 0, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -2948,6 +2948,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -2958,7 +3019,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3427,8 +3488,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-07 18:42:33.555456", - "modified_by": "Administrator", + "modified": "2017-08-31 11:22:30.190589", + "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", "owner": "Administrator", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index f4a3a3d5b21..7b2bf05c61c 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2169,7 +2169,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 1, + "no_copy": 0, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -2431,6 +2431,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -2727,8 +2788,8 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-09-07 18:43:10.487736", - "modified_by": "Administrator", + "modified": "2017-08-31 11:22:15.268846", + "modified_by": "Administrator", "module": "Selling", "name": "Quotation", "owner": "Administrator", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 8e9628cdf72..6ed1176a8bf 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2347,7 +2347,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 1, + "no_copy": 0, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -3271,6 +3271,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 0, + "options": "Subscription", + "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, @@ -3281,7 +3342,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3751,7 +3812,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-07 18:42:01.386972", + "modified": "2017-08-31 11:21:36.332326", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", From 24cb494a3b26e0dc4b8866f1f53154fa8dc06e5e Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 8 Sep 2017 10:07:39 +0100 Subject: [PATCH 068/164] Revert "Revert "make payment_schedule field no-copy"" This reverts commit fbd895d781b2718b35775fa36094c594c2b7ff89. --- .../purchase_invoice/purchase_invoice.json | 69 ++----------------- .../doctype/sales_invoice/sales_invoice.json | 69 ++----------------- .../purchase_order/purchase_order.json | 69 ++----------------- .../selling/doctype/quotation/quotation.json | 67 +----------------- .../doctype/sales_order/sales_order.json | 67 +----------------- 5 files changed, 18 insertions(+), 323 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 5051710298c..e27fdb18dde 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2804,7 +2804,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -3440,67 +3440,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -3511,7 +3450,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3950,8 +3889,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-31 11:22:47.074420", - "modified_by": "Administrator", + "modified": "2017-09-07 18:40:20.386968", + "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", "name_case": "Title Case", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index ba6421937f6..6e262df15e9 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2766,7 +2766,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -4273,67 +4273,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -4344,7 +4283,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -4847,8 +4786,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-31 11:23:08.675028", - "modified_by": "Administrator", + "modified": "2017-09-07 18:41:07.601012", + "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", "name_case": "Title Case", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 750e65f0c8b..808d53e6b8f 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2366,7 +2366,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -2948,67 +2948,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -3019,7 +2958,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3488,8 +3427,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 11:22:30.190589", - "modified_by": "Administrator", + "modified": "2017-09-07 18:42:33.555456", + "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", "owner": "Administrator", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 7b2bf05c61c..f4a3a3d5b21 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2169,7 +2169,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -2431,67 +2431,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, @@ -2788,8 +2727,8 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-08-31 11:22:15.268846", - "modified_by": "Administrator", + "modified": "2017-09-07 18:43:10.487736", + "modified_by": "Administrator", "module": "Selling", "name": "Quotation", "owner": "Administrator", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 6ed1176a8bf..8e9628cdf72 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2347,7 +2347,7 @@ "in_standard_filter": 0, "label": "Payment Schedule", "length": 0, - "no_copy": 0, + "no_copy": 1, "options": "Payment Schedule", "permlevel": 0, "precision": "", @@ -3271,67 +3271,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 0, - "options": "Subscription", - "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, @@ -3342,7 +3281,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 1, + "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3812,7 +3751,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 11:21:36.332326", + "modified": "2017-09-07 18:42:01.386972", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", From 225ac0dac36f2099f0306f52f3660d43e84cb5ec Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 7 Sep 2017 16:14:22 +0530 Subject: [PATCH 069/164] [Enhance] Subscription module (#10089) * [Enhance] Subscription module * Added view documents from the subscription form * Test cases * documentation * UI Test cases, fixes * Removed child table in the subscription * Provision to make subscription from the document, added subscription in the dashboard for the sales and buying flow * added patch to make subscription from the recurring data * Rename field subscriptio to subscription_id, added new test cases, remove recurring_document from controller * renamed subscription_id to subscription --- .../purchase_invoice/purchase_invoice.js | 9 +-- .../purchase_invoice/purchase_invoice.json | 65 +++++++++++++++++- .../doctype/sales_invoice/sales_invoice.json | 67 ++++++++++++++++++- .../purchase_order/purchase_order.json | 67 ++++++++++++++++++- .../selling/doctype/quotation/quotation.json | 65 +++++++++++++++++- .../doctype/sales_order/sales_order.json | 67 ++++++++++++++++++- .../doctype/sales_order/test_sales_order.js | 23 +++++++ 7 files changed, 342 insertions(+), 21 deletions(-) create mode 100644 erpnext/selling/doctype/sales_order/test_sales_order.js diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index a089090a6d2..e81dea27065 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -377,12 +377,5 @@ frappe.ui.form.on("Purchase Invoice", { erpnext.buying.get_default_bom(frm); } frm.toggle_reqd("supplier_warehouse", frm.doc.is_subcontracted==="Yes"); -<<<<<<< HEAD } -}) - - -======= - }, -}) ->>>>>>> develop +}) \ No newline at end of file diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index e27fdb18dde..066809ededd 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -3440,6 +3440,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -3450,7 +3511,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3889,7 +3950,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-09-07 18:40:20.386968", + "modified": "2017-08-31 11:22:47.074420", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 6e262df15e9..f1ba18c07a0 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -4273,6 +4273,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -4283,7 +4344,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_invoice", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -4785,8 +4846,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "menu_index": 0, - "modified": "2017-09-07 18:41:07.601012", + "menu_index": 0, + "modified": "2017-08-31 11:23:08.675028", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 808d53e6b8f..1e91ffa32db 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2948,6 +2948,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -2958,7 +3019,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3426,8 +3487,8 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "max_attachments": 0, - "modified": "2017-09-07 18:42:33.555456", + "max_attachments": 0, + "modified": "2017-08-31 11:22:30.190589", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index f4a3a3d5b21..87cc7a3912b 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2431,6 +2431,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -2727,8 +2788,8 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-09-07 18:43:10.487736", - "modified_by": "Administrator", + "modified": "2017-08-31 11:22:15.268846", + "modified_by": "Administrator", "module": "Selling", "name": "Quotation", "owner": "Administrator", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 8e9628cdf72..cdb5dcb8628 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -3271,6 +3271,67 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 0, + "options": "Subscription", + "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, @@ -3281,7 +3342,7 @@ "depends_on": "eval:doc.docstatus<2 && !doc.__islocal", "fieldname": "recurring_order", "fieldtype": "Section Break", - "hidden": 0, + "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, @@ -3751,8 +3812,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-07 18:42:01.386972", - "modified_by": "Administrator", + "modified": "2017-08-31 11:21:36.332326", + "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", "owner": "Administrator", diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.js b/erpnext/selling/doctype/sales_order/test_sales_order.js new file mode 100644 index 00000000000..57ed19b6965 --- /dev/null +++ b/erpnext/selling/doctype/sales_order/test_sales_order.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Sales Order", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially('Sales Order', [ + // insert a new Sales Order + () => frappe.tests.make([ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); From 96b8f223fd029aff7369ea43ac8dac336f111a7a Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 8 Sep 2017 15:35:59 +0100 Subject: [PATCH 070/164] fix failing tests --- erpnext/controllers/accounts_controller.py | 15 +++++++------ .../doctype/sales_order/test_sales_order.py | 21 +++++++------------ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 3b4637274f9..693513d0e64 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -609,11 +609,14 @@ class AccountsController(TransactionBase): def set_payment_schedule(self): due_date = self.due_date or get_due_date(self.posting_date) - self.append("payment_schedule", { - "due_date": due_date, - "invoice_portion": 100, - "payment_amount": self.grand_total - }) + + if self.get("payment_terms_template"): + data = get_payment_terms(self.payment_terms_template, self.posting_date, self.grand_total) + for item in data: + self.append("payment_schedule", item) + else: + data = dict(due_date=due_date, invoice_portion=100, payment_amount=self.grand_total) + self.append("payment_schedule", data) def set_due_date(self): self.due_date = max([d.due_date for d in self.get("payment_schedule")]) @@ -845,4 +848,4 @@ def get_due_date(posting_date, term): elif term.due_date_based_on == "Month(s) after the end of the invoice month": due_date = add_months(get_last_day(posting_date), term.credit_months) - return due_date \ No newline at end of file + return due_date diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index ff6166d86d2..c0bd63360de 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -9,9 +9,9 @@ from erpnext.stock.doctype.item.test_item import get_total_projected_qty from erpnext.selling.doctype.sales_order.sales_order \ import make_material_request, make_delivery_note, make_sales_invoice, WarehouseRequired from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry -from erpnext.controllers.accounts_controller import get_payment_terms from frappe.tests.test_permissions import set_user_permission_doctypes + class TestSalesOrder(unittest.TestCase): def tearDown(self): frappe.set_user("Administrator") @@ -64,25 +64,22 @@ class TestSalesOrder(unittest.TestCase): self.assertRaises(frappe.ValidationError, make_sales_invoice, so.name) - so.update( - {"payment_schedule": get_payment_terms( - "_Test Payment Term Template", so.transaction_date, so.grand_total - )} - ) + so.update({"payment_terms_template": "_Test Payment Term Template"}) so.save() so.submit() si = make_sales_invoice(so.name) - self.assertEqual(si.payment_schedule[0].payment_amount, 500.0) - self.assertEqual(si.payment_schedule[0].due_date.strftime(DATE_FORMAT), so.transaction_date) - self.assertEqual(si.payment_schedule[1].payment_amount, 500.0) - self.assertEqual(si.payment_schedule[1].due_date.strftime(DATE_FORMAT), add_days(so.transaction_date, 30)) - self.assertEquals(len(si.get("items")), len(so.get("items"))) self.assertEquals(len(si.get("items")), 1) si.insert() + + self.assertEqual(si.payment_schedule[0].payment_amount, 500.0) + self.assertEqual(si.payment_schedule[0].due_date, so.transaction_date) + self.assertEqual(si.payment_schedule[1].payment_amount, 500.0) + self.assertEqual(si.payment_schedule[1].due_date, add_days(so.transaction_date, 30)) + si.submit() si1 = make_sales_invoice(so.name) @@ -153,7 +150,6 @@ class TestSalesOrder(unittest.TestCase): so = make_sales_order() self.assertEqual(get_reserved_qty(), existing_reserved_qty + 10) - dn = create_dn_against_so(so.name, 15) self.assertEqual(get_reserved_qty(), existing_reserved_qty) @@ -209,7 +205,6 @@ class TestSalesOrder(unittest.TestCase): make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100) make_stock_entry(item="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", qty=10, rate=100) - existing_reserved_qty_item1 = get_reserved_qty("_Test Item") existing_reserved_qty_item2 = get_reserved_qty("_Test Item Home Desktop 100") From df3a175974474abe0234368273ea45c3189da5a6 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 11 Sep 2017 11:02:57 +0100 Subject: [PATCH 071/164] fix bugs: add `payment_schedule` if `payment_terms_schedule` specified --- .../purchase_order/test_purchase_order.py | 11 +++++------ erpnext/controllers/accounts_controller.py | 14 ++++++++++---- erpnext/public/js/controllers/transaction.js | 5 +++++ .../doctype/quotation/test_quotation.py | 18 ++++++++++-------- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 1bfc9cb68c2..44279d5e1d2 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -85,14 +85,12 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEquals(len(pi.get("items", [])), 1) def test_make_purchase_invoice_with_terms(self): - po = create_purchase_order(do_not_submit=True) + po = create_purchase_order(do_not_save=True) self.assertRaises(frappe.ValidationError, make_purchase_invoice, po.name) po.update( - {"payment_schedule": get_payment_terms( - "_Test Payment Term Template", po.transaction_date, po.grand_total - )} + {"payment_terms_template": "_Test Payment Term Template"} ) po.save() @@ -103,14 +101,15 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEqual(po.payment_schedule[1].payment_amount, 2500.0) self.assertEqual(po.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) pi = make_purchase_invoice(po.name) + pi.save() self.assertEquals(pi.doctype, "Purchase Invoice") self.assertEquals(len(pi.get("items", [])), 1) self.assertEqual(pi.payment_schedule[0].payment_amount, 2500.0) - self.assertEqual(pi.payment_schedule[0].due_date.strftime(DATE_FORMAT), po.transaction_date) + self.assertEqual(pi.payment_schedule[0].due_date, po.transaction_date) self.assertEqual(pi.payment_schedule[1].payment_amount, 2500.0) - self.assertEqual(pi.payment_schedule[1].due_date.strftime(DATE_FORMAT), add_days(po.transaction_date, 30)) + self.assertEqual(pi.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) def test_subcontracting(self): po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes") diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 693513d0e64..8c070d42902 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -26,7 +26,9 @@ class AccountsController(TransactionBase): return self.__company_currency def onload(self): + print("onload called:", self.get("__onload")) self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry') + self.set_payment_schedule() def validate(self): if self.get("_action") and self._action != "update_after_submit": @@ -51,6 +53,8 @@ class AccountsController(TransactionBase): self.set_due_date() self.validate_due_date() self.validate_advance_entries() + elif self.doctype in ("Quotation", "Purchase Order", "Sales Order"): + self.set_payment_schedule() if self.meta.get_field("taxes_and_charges"): self.validate_enabled_taxes_and_charges() @@ -608,13 +612,15 @@ class AccountsController(TransactionBase): self.remove(item) def set_payment_schedule(self): - due_date = self.due_date or get_due_date(self.posting_date) + posting_date = self.get("posting_date") or self.get("transaction_date") + date = self.get("due_date") + due_date = date or posting_date - if self.get("payment_terms_template"): - data = get_payment_terms(self.payment_terms_template, self.posting_date, self.grand_total) + if self.get("payment_terms_template") and not self.get("payment_schedule"): + data = get_payment_terms(self.payment_terms_template, posting_date, self.grand_total) for item in data: self.append("payment_schedule", item) - else: + elif not self.get("payment_schedule"): data = dict(due_date=due_date, invoice_portion=100, payment_amount=self.grand_total) self.append("payment_schedule", data) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 2d11d6bd44d..6344a96c62d 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -123,6 +123,11 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ } } + if(this.frm.fields_dict["payment_terms_template"]){ + console.log("triggered"); + this.frm.trigger("payment_terms_template"); + } + if(this.frm.fields_dict["taxes"]) { this["taxes_remove"] = this.calculate_taxes_and_totals; } diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index f40a4ca86a7..bb083ee98be 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -40,16 +40,15 @@ class TestQuotation(unittest.TestCase): quotation = frappe.copy_doc(test_records[0]) quotation.transaction_date = nowdate() quotation.valid_till = add_months(quotation.transaction_date, 1) - quotation.insert() quotation.update( - {"payment_schedule": get_payment_terms( - "_Test Payment Term Template", quotation.transaction_date, quotation.grand_total - )} + {"payment_terms_template": "_Test Payment Term Template"} ) + quotation.insert() self.assertRaises(frappe.ValidationError, make_sales_order, quotation.name) quotation.save() quotation.submit() + self.assertEqual(quotation.payment_schedule[0].payment_amount, 8906.25) self.assertEqual(quotation.payment_schedule[0].due_date, quotation.transaction_date) self.assertEqual(quotation.payment_schedule[1].payment_amount, 8906.25) @@ -62,16 +61,19 @@ class TestQuotation(unittest.TestCase): self.assertEquals(sales_order.get("items")[0].doctype, "Sales Order Item") self.assertEquals(sales_order.get("items")[0].prevdoc_docname, quotation.name) self.assertEquals(sales_order.customer, "_Test Customer") - self.assertEqual(sales_order.payment_schedule[0].payment_amount, 8906.25) - self.assertEqual(sales_order.payment_schedule[0].due_date.strftime(DATE_FORMAT), quotation.transaction_date) - self.assertEqual(sales_order.payment_schedule[1].payment_amount, 8906.25) - self.assertEqual(sales_order.payment_schedule[1].due_date.strftime(DATE_FORMAT), add_days(quotation.transaction_date, 30)) sales_order.delivery_date = "2014-01-01" sales_order.naming_series = "_T-Quotation-" sales_order.transaction_date = nowdate() sales_order.insert() + self.assertEqual(sales_order.payment_schedule[0].payment_amount, 8906.25) + self.assertEqual(sales_order.payment_schedule[0].due_date, quotation.transaction_date) + self.assertEqual(sales_order.payment_schedule[1].payment_amount, 8906.25) + self.assertEqual( + sales_order.payment_schedule[1].due_date, add_days(quotation.transaction_date, 30) + ) + def test_valid_till(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order From ecb118fb3b77c329513775c32b2dc038d86a05e5 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 11 Sep 2017 15:45:10 +0100 Subject: [PATCH 072/164] bugfix: call `set_payment_schedule` only in relevant doc --- erpnext/controllers/accounts_controller.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 8c070d42902..3464093f7e1 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -26,9 +26,10 @@ class AccountsController(TransactionBase): return self.__company_currency def onload(self): - print("onload called:", self.get("__onload")) self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry') - self.set_payment_schedule() + relevant_docs = ("Quotation", "Purchase Order", "Sales Order", "Purchase Invoice", "Purchase Order") + if self.doctype in relevant_docs: + self.set_payment_schedule() def validate(self): if self.get("_action") and self._action != "update_after_submit": From 4bf3ed47ff8fbe0f73db8903441de5829ccd1f99 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 18 Sep 2017 11:54:28 +0100 Subject: [PATCH 073/164] revert from trying to adjust payment schedule based on old recurring_document --- erpnext/controllers/accounts_controller.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 3464093f7e1..0e54c4ae404 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -640,12 +640,7 @@ class AccountsController(TransactionBase): total += flt(d.payment_amount) if total != self.grand_total: - # Try to recover if the Payment Term is a very simple one. - # If there is just one Payment Term and the invoice portion is 100: - if len(self.payment_schedule) == 1 and self.payment_schedule[0].invoice_portion == 100: - self.payment_schedule[0].update({'payment_amount': self.grand_total}) - else: - frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) + frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) @frappe.whitelist() From 9448f4b13cb9ef7c32a729631316bf6b58fd7e86 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 18 Sep 2017 12:08:34 +0100 Subject: [PATCH 074/164] codacy corrections --- .../purchase_order/test_purchase_order.py | 4 +- erpnext/controllers/recurring_document.py | 233 ------------------ .../change_default_customer_credit_days.py | 2 +- .../v8_10/update_gl_due_date_for_pi_and_si.py | 4 +- erpnext/public/js/controllers/transaction.js | 1 - .../doctype/quotation/test_quotation.py | 3 +- .../doctype/sales_order/test_sales_order.py | 2 +- 7 files changed, 7 insertions(+), 242 deletions(-) delete mode 100644 erpnext/controllers/recurring_document.py diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 44279d5e1d2..6e40b5defab 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -5,9 +5,9 @@ from __future__ import unicode_literals import unittest import frappe import frappe.defaults -from frappe.utils import flt, add_days, nowdate, DATE_FORMAT +from frappe.utils import flt, add_days, nowdate from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt, make_purchase_invoice -from erpnext.controllers.accounts_controller import get_payment_terms + class TestPurchaseOrder(unittest.TestCase): def test_make_purchase_receipt(self): diff --git a/erpnext/controllers/recurring_document.py b/erpnext/controllers/recurring_document.py deleted file mode 100644 index 6919434bd0c..00000000000 --- a/erpnext/controllers/recurring_document.py +++ /dev/null @@ -1,233 +0,0 @@ -from __future__ import unicode_literals -import frappe -import calendar -import frappe.utils -import frappe.defaults - -from frappe.utils import cint, cstr, getdate, nowdate, \ - get_first_day, get_last_day, split_emails - -from frappe import _, msgprint, throw - - -month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12} -date_field_map = { - "Sales Order": "transaction_date", - "Sales Invoice": "posting_date", - "Purchase Order": "transaction_date", - "Purchase Invoice": "posting_date" -} - -def create_recurring_documents(): - manage_recurring_documents("Sales Order") - manage_recurring_documents("Sales Invoice") - manage_recurring_documents("Purchase Order") - manage_recurring_documents("Purchase Invoice") - -def manage_recurring_documents(doctype, next_date=None, commit=True): - """ - Create recurring documents on specific date by copying the original one - and notify the concerned people - """ - next_date = next_date or nowdate() - - date_field = date_field_map[doctype] - - condition = " and ifnull(status, '') != 'Closed'" if doctype in ("Sales Order", "Purchase Order") else "" - - recurring_documents = frappe.db.sql("""select name, recurring_id - from `tab{0}` where is_recurring=1 - and (docstatus=1 or docstatus=0) and next_date=%s - and next_date <= ifnull(end_date, '2199-12-31') {1}""".format(doctype, condition), next_date) - - exception_list = [] - for ref_document, recurring_id in recurring_documents: - if not frappe.db.sql("""select name from `tab%s` - where %s=%s and recurring_id=%s and (docstatus=1 or docstatus=0)""" - % (doctype, date_field, '%s', '%s'), (next_date, recurring_id)): - try: - reference_doc = frappe.get_doc(doctype, ref_document) - new_doc = make_new_document(reference_doc, date_field, next_date) - if reference_doc.notify_by_email: - send_notification(new_doc) - if commit: - frappe.db.commit() - except: - if commit: - frappe.db.rollback() - - frappe.db.begin() - frappe.db.sql("update `tab%s` \ - set is_recurring = 0 where name = %s" % (doctype, '%s'), - (ref_document)) - notify_errors(ref_document, doctype, reference_doc.get("customer") or reference_doc.get("supplier"), - reference_doc.owner) - frappe.db.commit() - - exception_list.append(frappe.get_traceback()) - finally: - if commit: - frappe.db.begin() - - if exception_list: - exception_message = "\n\n".join([cstr(d) for d in exception_list]) - frappe.throw(exception_message) - -def make_new_document(reference_doc, date_field, posting_date): - from erpnext.controllers.accounts_controller import get_payment_terms - new_document = frappe.copy_doc(reference_doc, ignore_no_copy=False) - mcount = month_map[reference_doc.recurring_type] - - from_date = get_next_date(reference_doc.from_date, mcount) - - # get last day of the month to maintain period if the from date is first day of its own month - # and to date is the last day of its own month - if (cstr(get_first_day(reference_doc.from_date)) == cstr(reference_doc.from_date)) and \ - (cstr(get_last_day(reference_doc.to_date)) == cstr(reference_doc.to_date)): - to_date = get_last_day(get_next_date(reference_doc.to_date, mcount)) - else: - to_date = get_next_date(reference_doc.to_date, mcount) - - new_document.update({ - date_field: posting_date, - "from_date": from_date, - "to_date": to_date, - "next_date": get_next_date(reference_doc.next_date, mcount,cint(reference_doc.repeat_on_day_of_month)), - "payment_schedule": get_payment_terms("_Test Payment Term Template 3", posting_date, new_document.grand_total) - }) - - if new_document.meta.get_field('set_posting_time'): - new_document.set('set_posting_time', 1) - - # copy document fields - for fieldname in ("owner", "recurring_type", "repeat_on_day_of_month", - "recurring_id", "notification_email_address", "is_recurring", "end_date", - "title", "naming_series", "select_print_heading", "ignore_pricing_rule", - "posting_time", "remarks", 'submit_on_creation'): - if new_document.meta.get_field(fieldname): - new_document.set(fieldname, reference_doc.get(fieldname)) - - # copy item fields - for i, item in enumerate(new_document.items): - for fieldname in ("page_break",): - item.set(fieldname, reference_doc.items[i].get(fieldname)) - - new_document.run_method("on_recurring", reference_doc=reference_doc) - - if reference_doc.submit_on_creation: - new_document.insert() - new_document.submit() - else: - new_document.docstatus=0 - new_document.insert() - - return new_document - -def get_next_date(dt, mcount, day=None): - dt = getdate(dt) - - from dateutil.relativedelta import relativedelta - dt += relativedelta(months=mcount, day=day) - - return dt - -def send_notification(new_rv): - """Notify concerned persons about recurring document generation""" - - frappe.sendmail(new_rv.notification_email_address, - subject= _("New {0}: #{1}").format(new_rv.doctype, new_rv.name), - message = _("Please find attached {0} #{1}").format(new_rv.doctype, new_rv.name), - attachments = [frappe.attach_print(new_rv.doctype, new_rv.name, file_name=new_rv.name, print_format=new_rv.recurring_print_format)]) - -def notify_errors(doc, doctype, party, owner): - from frappe.utils.user import get_system_managers - recipients = get_system_managers(only_name=True) - - frappe.sendmail(recipients + [frappe.db.get_value("User", owner, "email")], - subject="[Urgent] Error while creating recurring %s for %s" % (doctype, doc), - message = frappe.get_template("templates/emails/recurring_document_failed.html").render({ - "type": doctype, - "name": doc, - "party": party - })) - - assign_task_to_owner(doc, doctype, "Recurring Invoice Failed", recipients) - -def assign_task_to_owner(doc, doctype, msg, users): - for d in users: - from frappe.desk.form import assign_to - args = { - 'assign_to' : d, - 'doctype' : doctype, - 'name' : doc, - 'description' : msg, - 'priority' : 'High' - } - assign_to.add(args) - -def validate_recurring_document(doc): - if doc.is_recurring: - validate_notification_email_id(doc) - if not doc.recurring_type: - frappe.throw(_("Please select {0}").format(doc.meta.get_label("recurring_type"))) - - elif not (doc.from_date and doc.to_date): - frappe.throw(_("Period From and Period To dates mandatory for recurring {0}").format(doc.doctype)) - -def validate_recurring_next_date(doc): - posting_date = doc.get("posting_date") or doc.get("transaction_date") - if getdate(posting_date) > getdate(doc.next_date): - frappe.throw(_("Next Date must be greater than Posting Date")) - - next_date = getdate(doc.next_date) - if next_date.day != doc.repeat_on_day_of_month: - - # if the repeat day is the last day of the month (31) - # and the current month does not have as many days, - # then the last day of the current month is a valid date - lastday = calendar.monthrange(next_date.year, next_date.month)[1] - if doc.repeat_on_day_of_month < lastday: - - # the specified day of the month is not same as the day specified - # or the last day of the month - frappe.throw(_("Next Date's day and Repeat on Day of Month must be equal")) - -def convert_to_recurring(doc, posting_date): - if doc.is_recurring: - if not doc.recurring_id: - doc.db_set("recurring_id", doc.name) - - set_next_date(doc, posting_date) - - if doc.next_date: - validate_recurring_next_date(doc) - - elif doc.recurring_id: - doc.db_set("recurring_id", None) - -def validate_notification_email_id(doc): - if doc.notify_by_email: - if doc.notification_email_address: - email_list = split_emails(doc.notification_email_address.replace("\n", "")) - - from frappe.utils import validate_email_add - for email in email_list: - if not validate_email_add(email): - throw(_("{0} is an invalid email address in 'Notification \ - Email Address'").format(email)) - - else: - frappe.throw(_("'Notification Email Addresses' not specified for recurring %s") \ - % doc.doctype) - -def set_next_date(doc, posting_date): - """ Set next date on which recurring document will be created""" - if not doc.repeat_on_day_of_month: - msgprint(_("Please enter 'Repeat on Day of Month' field value"), raise_exception=1) - - next_date = get_next_date(posting_date, month_map[doc.recurring_type], - cint(doc.repeat_on_day_of_month)) - - doc.db_set('next_date', next_date) - - msgprint(_("Next Recurring {0} will be created on {1}").format(doc.doctype, next_date)) diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py index a9197137418..9008a439402 100644 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -99,7 +99,7 @@ def make_payment_term(days, based_on): doc.payment_term_name = 'N{0}'.format(days) else: doc.credit_months = 1 - doc.description = 'Net payable by the end of next month'.format(days) + doc.description = 'Net payable by the end of next month' doc.payment_term_name = 'EO2M' doc.save() diff --git a/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py index 8ececeb6e2f..f54ff80ff58 100644 --- a/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py +++ b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py @@ -1,8 +1,8 @@ from __future__ import unicode_literals import frappe -"""This will update existing GL Entries by saving its linked Purchase/Sales Invoice's -and Journal Entry's due date as the due date for the GL Entry""" +# This will update existing GL Entries by saving its linked Purchase/Sales Invoice's +# Journal Entry's due date as the due date for the GL Entry def execute(): diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 6344a96c62d..f3db26745a4 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -124,7 +124,6 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ } if(this.frm.fields_dict["payment_terms_template"]){ - console.log("triggered"); this.frm.trigger("payment_terms_template"); } diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index bb083ee98be..7fa91b5a92e 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -3,8 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import flt, add_days, nowdate, add_months, DATE_FORMAT -from erpnext.controllers.accounts_controller import get_payment_terms +from frappe.utils import flt, add_days, nowdate, add_months import unittest test_dependencies = ["Product Bundle"] diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index c0bd63360de..972453caceb 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals import frappe -from frappe.utils import flt, add_days, DATE_FORMAT +from frappe.utils import flt, add_days import frappe.permissions import unittest from erpnext.stock.doctype.item.test_item import get_total_projected_qty From da1795491947097bd2f0703d2b3604bedec0d207 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 19 Sep 2017 17:53:31 +0100 Subject: [PATCH 075/164] fix failing tests --- .../accounts/doctype/sales_invoice/test_sales_invoice.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 44cc8d774ec..60e1dbc8490 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -206,6 +206,7 @@ class TestSalesInvoice(unittest.TestCase): # additional discount si.discount_amount = 100 si.apply_discount_on = 'Net Total' + si.payment_schedule = [] si.save() @@ -218,6 +219,7 @@ class TestSalesInvoice(unittest.TestCase): # additional discount on grand total si.discount_amount = 100 si.apply_discount_on = 'Grand Total' + si.payment_schedule = [] si.save() @@ -1344,6 +1346,11 @@ def create_sales_invoice(**args): si.insert() if not args.do_not_submit: si.submit() + else: + si.payment_schedule = [] + else: + si.payment_schedule = [] + return si test_dependencies = ["Journal Entry", "Contact", "Address"] From 4712ed6377bc899da8904b8098beda4413eb0674 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 19 Sep 2017 21:30:34 +0100 Subject: [PATCH 076/164] remove logging statement --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 61ede97122c..08f21b1e230 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -252,7 +252,6 @@ frappe.ui.form.on('Payment Entry', { date: frm.doc.posting_date }, callback: function(r, rt) { - console.log(r, rt); if(r.message) { if(frm.doc.payment_type == "Receive") { frm.set_value("paid_from", r.message.party_account); From 35c84fe4f20a77381266eddd80ea52ba7bc1357c Mon Sep 17 00:00:00 2001 From: tunde Date: Wed, 20 Sep 2017 12:26:19 +0100 Subject: [PATCH 077/164] fix failing test case --- .../doctype/payment_entry/payment_entry.py | 33 +++++++------------ .../payment_entry/test_payment_entry.py | 2 +- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 195a27f69af..14310f8001c 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -762,29 +762,20 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= pe.received_amount = received_amount pe.allocate_payment_amount = 1 pe.letter_head = doc.get("letter_head") + args = { + 'party_account': party_account, 'company': pe.company, 'party_type': pe.party_type, + 'party': pe.party, 'posting_date': pe.posting_date + } + references = get_outstanding_reference_documents(args=args) - if doc.get("payment_schedule"): - for d in doc.get("payment_schedule"): - invoice_amount = d.payment_amount * doc.conversion_rate \ - if party_account_currency == doc.company_currency else d.payment_amount - paid_amount = get_paid_amount(dt, dn, party_type, pe.party, party_account, d.due_date) - outstanding_amount = invoice_amount - paid_amount - pe.append("references", { - "reference_doctype": dt, - "reference_name": dn, - "due_date": d.due_date, - "total_amount": invoice_amount, - "outstanding_amount": outstanding_amount, - "allocated_amount": outstanding_amount - }) - else: + for reference in references: pe.append("references", { - "reference_doctype": dt, - "reference_name": dn, - "due_date": doc.get("due_date"), - "total_amount": grand_total, - "outstanding_amount": outstanding_amount, - "allocated_amount": outstanding_amount + 'reference_doctype': reference.voucher_type, + 'reference_name': reference.voucher_no, + 'due_date': reference.due_date, + 'total_amount': reference.invoice_amount, + 'outstanding_amount': reference.outstanding_amount, + 'allocated_amount': reference.outstanding_amount }) pe.setup_party_account_field() diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index 60be20dd89a..af6d785dbc2 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -212,7 +212,7 @@ class TestPaymentEntry(unittest.TestCase): self.assertRaises(InvalidPaymentEntry, pe1.validate) - si1 = create_sales_invoice() + si1 = create_sales_invoice() # create full payment entry against si1 pe2 = get_payment_entry("Sales Invoice", si1.name, bank_account="_Test Cash - _TC") From 99849f8eabf6cdc2da1975470d3cbfb5b858fe0a Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 21 Sep 2017 10:23:40 +0100 Subject: [PATCH 078/164] fix failing tests --- .../doctype/payment_entry/payment_entry.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 4913fe1ca55..6901c8edd06 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -769,14 +769,18 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= references = get_outstanding_reference_documents(args=args) for reference in references: - pe.append("references", { - 'reference_doctype': reference.voucher_type, - 'reference_name': reference.voucher_no, - 'due_date': reference.due_date, - 'total_amount': reference.invoice_amount, - 'outstanding_amount': reference.outstanding_amount, - 'allocated_amount': reference.outstanding_amount - }) + if reference.voucher_no == dn: + allocated_amount = min(paid_amount, reference.outstanding_amount) + pe.append("references", { + 'reference_doctype': reference.voucher_type, + 'reference_name': reference.voucher_no, + 'due_date': reference.due_date, + 'total_amount': reference.invoice_amount, + 'outstanding_amount': reference.outstanding_amount, + 'allocated_amount': reference.outstanding_amount + }) + if paid_amount: + paid_amount -= allocated_amount pe.setup_party_account_field() pe.set_missing_values() @@ -785,6 +789,7 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= pe.set_amounts() return pe + def get_paid_amount(dt, dn, party_type, party, account, due_date): if party_type=="Customer": dr_or_cr = "credit_in_account_currency - debit_in_account_currency" From 951092eecd269ba90aa1836e1083a1d3f1087135 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 21 Sep 2017 11:14:53 +0100 Subject: [PATCH 079/164] fix sales order and pricing rule failing tests --- erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py | 2 ++ erpnext/selling/doctype/sales_order/test_sales_order.py | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index 9ec69c32c71..3fa34e279a3 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -256,6 +256,7 @@ class TestPricingRule(unittest.TestCase): make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10) si = create_sales_invoice(do_not_save=True) si.items[0].price_list_rate = 1000 + si.payment_schedule = [] si.insert(ignore_permissions=True) item = si.items[0] @@ -264,6 +265,7 @@ class TestPricingRule(unittest.TestCase): # With discount item.discount_percentage = 10 + si.payment_schedule = [] si.save() item = si.items[0] self.assertEquals(item.rate, 990) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 972453caceb..8f3b14a199a 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -526,6 +526,8 @@ class TestSalesOrder(unittest.TestCase): self.assertEquals(new_so.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate)) new_so.items[0].margin_rate_or_amount = 25 + new_so.payment_schedule = [] + new_so.save() new_so.submit() self.assertEquals(new_so.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate)) @@ -564,6 +566,10 @@ def make_sales_order(**args): so.insert() if not args.do_not_submit: so.submit() + else: + so.payment_schedule = [] + else: + so.payment_schedule = [] return so From d7d306bfdbef20c28ad1e6a9786bcb5944905da6 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 21 Sep 2017 13:43:38 +0100 Subject: [PATCH 080/164] fix final failing test --- erpnext/accounts/doctype/payment_entry/payment_entry.py | 4 ++-- erpnext/accounts/doctype/payment_entry/test_payment_entry.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 6901c8edd06..406dfbc9d1f 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -290,7 +290,7 @@ class PaymentEntry(AccountsController): def set_difference_amount(self): base_unallocated_amount = flt(self.unallocated_amount) * (flt(self.source_exchange_rate) - if self.payment_type=="Receive" else flt(self.target_exchange_rate)) + if self.payment_type == "Receive" else flt(self.target_exchange_rate)) base_party_amount = flt(self.base_total_allocated_amount) + flt(base_unallocated_amount) @@ -777,7 +777,7 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= 'due_date': reference.due_date, 'total_amount': reference.invoice_amount, 'outstanding_amount': reference.outstanding_amount, - 'allocated_amount': reference.outstanding_amount + 'allocated_amount': allocated_amount }) if paid_amount: paid_amount -= allocated_amount diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index af6d785dbc2..3264bbb5ee8 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -108,7 +108,7 @@ class TestPaymentEntry(unittest.TestCase): self.assertEqual(outstanding_amount, 0) def test_payment_entry_against_si_usd_to_inr(self): - si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC", + si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC", currency="USD", conversion_rate=50) pe = get_payment_entry("Sales Invoice", si.name, party_amount=20, bank_account="_Test Bank - _TC", bank_amount=900) From 25cda2900743438d3ecc33840a2c878a9b71086f Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 21 Sep 2017 14:33:39 +0100 Subject: [PATCH 081/164] fix test Employee --- erpnext/hr/doctype/expense_claim/test_expense_claim.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/hr/doctype/expense_claim/test_expense_claim.py b/erpnext/hr/doctype/expense_claim/test_expense_claim.py index b8135374416..9b4832ac5e7 100644 --- a/erpnext/hr/doctype/expense_claim/test_expense_claim.py +++ b/erpnext/hr/doctype/expense_claim/test_expense_claim.py @@ -8,6 +8,7 @@ from frappe.utils import random_string, nowdate from erpnext.hr.doctype.expense_claim.expense_claim import make_bank_entry test_records = frappe.get_test_records('Expense Claim') +test_dependencies = ['Employee'] class TestExpenseClaim(unittest.TestCase): def test_total_expense_claim_for_project(self): From 73a83a472d6f8594e37017b49d00a8df1ca970e6 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 11:04:31 +0100 Subject: [PATCH 082/164] validation for Payment Terms Template --- .../payment_terms_template.py | 22 ++++++++++++++++++- .../user/manual/en/accounts/payment-terms.md | 0 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 erpnext/docs/user/manual/en/accounts/payment-terms.md diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py index d2344d6c77b..363484d9b1a 100644 --- a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py @@ -3,8 +3,28 @@ # For license information, please see license.txt from __future__ import unicode_literals + +import frappe from frappe.model.document import Document +from frappe.utils import flt +from frappe import _ class PaymentTermsTemplate(Document): - pass + def validate(self): + self.validate_invoice_portion() + self.validate_credit_days() + + def validate_invoice_portion(self): + total_portion = 0 + for term in self.terms: + total_portion += term.invoice_portion + + if flt(total_portion, 2) != 100.00: + frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red') + + def validate_credit_days(self): + for term in self.terms: + if term.credit_days < 0: + frappe.msgprint(_('Credit Days cannot be a negative number'), raise_exception=1, indicator='red') + diff --git a/erpnext/docs/user/manual/en/accounts/payment-terms.md b/erpnext/docs/user/manual/en/accounts/payment-terms.md new file mode 100644 index 00000000000..e69de29bb2d From 62af5c5693a1e7f3412a03cf6789026038747081 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 15:16:38 +0100 Subject: [PATCH 083/164] more validation checks and test fixes --- .../purchase_invoice/test_purchase_invoice.py | 6 +- .../sales_invoice/test_sales_invoice.py | 6 +- erpnext/controllers/accounts_controller.py | 57 ++++++++++++++----- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 59e64aa4d07..83e11815070 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -607,11 +607,13 @@ class TestPurchaseInvoice(unittest.TestCase): pi = make_purchase_invoice(do_not_save=True, supplier="_Test Supplier P") pi.append("payment_schedule", { "due_date": add_days(nowdate(), 15), - "payment_amount": 100 + "payment_amount": 100, + "invoice_portion": 40.00 }) pi.append("payment_schedule", { "due_date": add_days(nowdate(), 45), - "payment_amount": 150 + "payment_amount": 150, + "invoice_portion": 60.00 }) pi.save() diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index da33a7807a1..235dec45542 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1279,11 +1279,13 @@ class TestSalesInvoice(unittest.TestCase): si = create_sales_invoice(do_not_save=True, customer="_Test Customer P") si.append("payment_schedule", { "due_date": add_days(nowdate(), 15), - "payment_amount": 20 + "payment_amount": 20, + "invoice_portion": 20.00 }) si.append("payment_schedule", { "due_date": add_days(nowdate(), 45), - "payment_amount": 80 + "payment_amount": 80, + "invoice_portion": 80.00 }) si.save() diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 0e54c4ae404..cc624c8c3b5 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -34,6 +34,7 @@ class AccountsController(TransactionBase): def validate(self): if self.get("_action") and self._action != "update_after_submit": self.set_missing_values(for_validate=True) + self.validate_date_with_fiscal_year() if self.meta.get_field("currency"): @@ -45,17 +46,7 @@ class AccountsController(TransactionBase): validate_return(self) self.set_total_in_words() - if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return: - if self.get("payment_schedule"): - self.set_due_date() - self.validate_payment_schedule() - else: - self.set_payment_schedule() - self.set_due_date() - self.validate_due_date() - self.validate_advance_entries() - elif self.doctype in ("Quotation", "Purchase Order", "Sales Order"): - self.set_payment_schedule() + self.validate_all_documents_schedule() if self.meta.get_field("taxes_and_charges"): self.validate_enabled_taxes_and_charges() @@ -66,6 +57,29 @@ class AccountsController(TransactionBase): if self.doctype == 'Purchase Invoice': self.validate_paid_amount() + def validate_invoice_documents_schedule(self): + if self.get("payment_schedule"): + self.set_due_date() + self.validate_payment_schedule() + else: + self.set_payment_schedule() + self.set_due_date() + self.validate_due_date() + self.validate_advance_entries() + + def validate_non_invoice_documents_schedule(self): + if self.get("payment_schedule"): + self.validate_invoice_portion() + self.validate_payment_schedule_amount() + else: + self.set_payment_schedule() + + def validate_all_documents_schedule(self): + if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return: + self.validate_invoice_documents_schedule() + elif self.doctype in ("Quotation", "Purchase Order", "Sales Order"): + self.validate_non_invoice_documents_schedule() + def before_print(self): if self.doctype in ['Purchase Order', 'Sales Order']: if self.get("group_same_items"): @@ -85,11 +99,11 @@ class AccountsController(TransactionBase): self.paid_amount = 0 frappe.throw(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified")) else: - frappe.db.set(self,'paid_amount',0) + frappe.db.set(self, 'paid_amount', 0) def set_missing_values(self, for_validate=False): if frappe.flags.in_test: - for fieldname in ["posting_date","transaction_date"]: + for fieldname in ["posting_date", "transaction_date"]: if self.meta.get_field(fieldname) and not self.get(fieldname): self.set(fieldname, today()) break @@ -629,19 +643,34 @@ class AccountsController(TransactionBase): self.due_date = max([d.due_date for d in self.get("payment_schedule")]) def validate_payment_schedule(self): + self.validate_payment_schedule_dates() + self.validate_invoice_portion() + self.validate_payment_schedule_amount() + + def validate_payment_schedule_dates(self): if self.due_date and getdate(self.due_date) < getdate(self.posting_date): frappe.throw(_("Due Date cannot be before posting date")) - total = 0 for d in self.get("payment_schedule"): if getdate(d.due_date) < getdate(self.posting_date): frappe.throw(_("Row {0}: Due Date cannot be before posting date").format(d.idx)) + def validate_payment_schedule_amount(self): + total = 0 + for d in self.get("payment_schedule"): total += flt(d.payment_amount) if total != self.grand_total: frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) + def validate_invoice_portion(self): + total_portion = 0 + for term in self.payment_schedule: + total_portion += term.invoice_portion + + if flt(total_portion, 2) != 100.00: + frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red') + @frappe.whitelist() def get_tax_rate(account_head): From d6cf6fb124228532157cab9bd33ee062e9eda85b Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 15:49:02 +0100 Subject: [PATCH 084/164] documentation for payment terms --- .../user/manual/en/accounts/payment-terms.md | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/erpnext/docs/user/manual/en/accounts/payment-terms.md b/erpnext/docs/user/manual/en/accounts/payment-terms.md index e69de29bb2d..4f28d0da17c 100644 --- a/erpnext/docs/user/manual/en/accounts/payment-terms.md +++ b/erpnext/docs/user/manual/en/accounts/payment-terms.md @@ -0,0 +1,70 @@ +# Payment Terms +You can save your business' payment terms on ERPNext and include it in all documents in the sales/purchase cycle and ERPNext will make all the proper general ledger entries accordingly. + +The documents you can attach Payment Terms to are: +- Sales Invoice +- Purchase Invoice +- Sales Order +- Purchase Order +- Quotation + +Note that the introduction of Payment Terms removes "Credit Days" and "Credit Days Based On" fields in Customer/Supplier master. Payment Term contains the same information and makes it more flexible to use. + +## Payment Terms +Navigate to the Payment Term list page and click "New". +> Accounts > Payment Term > New Payment Term + +Payment Term has the following fields: +**Payment Term Name:** (optional) The name for this Payment Term. + +**Due Date Based On:** The basis by which the due date for the Payment Term is to be calculated. There are three options: +- Day(s) after invoice date: Due date should be calculated in days with reference to the posting date of the invoice +- Day(s) after the end of the invoice month: Due date should be calculated in days with reference to the last day of the month in which the invoice was created +- Month(s) after the end of the invoice month: Due date should be calculated in months with reference to the last day of the month in which the invoice was created + +**Invoice Portion:** (optional) The portion of the total invoice amount for which this Payment Term should be applied. Value given will be regarded as percentage i.e 100 = 100% + +**Credit Days:** (optional) The number of days or month credit is allowed depending on the option chosen in the `Due Date Based On` field. 0 means no credit allowed. + +**Description:** (optional) A brief description of the Payment Term. + +## Payment Terms In Converted Documents +When converting or copying documents in the sales/purchase cycle, the attached Payment Term(s) will not be copied. The reason for this is because the copied information might no longer be true. For example, a Quotation is created for a service costing $1000 on January 1 with payment term of "N 30" (Net payable within 30 days) and then sent to a customer. On the quotation, the due date on the invoice will be January 30. Let's say the customer agrees to the quotation of January 20 and you decide to make an invoice from the Quotation. If the Payment Terms from the Quotation is copied, the due date on the invoice will still wrongly read January 30. This issue also applies for recurring documents. + +This does not mean you have manually set Payment Terms for every document. If you want the Payment Terms to be copyable, make use of Payment Terms Template. + +## Payment Terms Template +Payment Terms Template tells ERPNext how to populate the table in the Payment Terms Schedule section of the sales/purchase document. + +You should use it if you have a set of standard Payment Terms or if you want the Payment Term(s) on a sales/purchase document to be copyable. + +To create a new Payment Terms Template, navigate to the Payment Term Template creation form: +> Accounts > Payment Terms Template > New Payment Terms Template + +**Payment Term:** (optional) The name for this Payment Term. + +**Due Date Based On:** The basis by which the due date for the Payment Term is to be calculated. There are three options: +- Day(s) after invoice date: Due date should be calculated in days with reference to the posting date of the invoice +- Day(s) after the end of the invoice month: Due date should be calculated in days with reference to the last day of the month in which the invoice was created +- Month(s) after the end of the invoice month: Due date should be calculated in months with reference to the last day of the month in which the invoice was created + +**Invoice Portion:** (optional) The portion of the total invoice amount for which this Payment Term should be applied. Value given will be regarded as percentage i.e 100 = 100% + +**Credit Days:** (optional) The number of days or month credit is allowed depending on the option chosen in the `Due Date Based On` field. 0 means no credit allowed. + +**Description:** (optional) A brief description of the Payment Term. + +Add as many rows as needed but make sure that the sum of the values in the `Invoice Portion` fields in all populated rows equals 100. + +## How to Add Payment Terms To Documents +You can add Payments Terms in the "Payment Terms Schedule" section of the Document. Each row in the table represents a portion of the document's grand total. The table collects the following information: + +**Payment Term:** (optional) The name of the Payment Term document you require. If this is added, the data from the selected Payment Term will be used to populate the remaining columns in the row. + +**Description:** (optional) Description of the Payment Term. + +**Due Date:** (optional) The due date for the portion of the invoice. Set this value only if you did not specify anything in the `Payment Term` column. + +**Invoice Portion:** The percentage portion of the document represented in each row. + +**Payment Amount:** The amount due from the portion of the invoice represented by each row. From e6b3fe1215a2d433d6f9f29ca4c0232c7e5a4cf5 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 16:04:07 +0100 Subject: [PATCH 085/164] add tests for payment term template --- .../test_payment_terms_template.py | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py index ec370668a0e..c1b76a33ce3 100644 --- a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py @@ -4,6 +4,46 @@ from __future__ import unicode_literals import unittest +import frappe + class TestPaymentTermsTemplate(unittest.TestCase): - pass + def tearDown(self): + frappe.delete_doc('Payment Terms Template', '_Test Payment Terms Template', force=1) + + def test_create_template(self): + template = frappe.get_doc({ + 'doctype': 'Payment Terms Template', + 'template_name': '_Test Payment Terms Template', + 'terms': [{ + 'doctype': 'Payment Terms Template Detail', + 'invoice_portion': 50.00, + 'credit_days_based_on': 'Day(s) after invoice date', + 'credit_days': 30 + }] + }) + + self.assertRaises(frappe.ValidationError, template.insert) + + template.append('terms', { + 'doctype': 'Payment Terms Template Detail', + 'invoice_portion': 50.00, + 'credit_days_based_on': 'Day(s) after invoice date', + 'credit_days': 0 + }) + + template.insert() + + def test_credit_days(self): + template = frappe.get_doc({ + 'doctype': 'Payment Terms Template', + 'template_name': '_Test Payment Terms Template', + 'terms': [{ + 'doctype': 'Payment Terms Template Detail', + 'invoice_portion': 100.00, + 'credit_days_based_on': 'Day(s) after invoice date', + 'credit_days': -30 + }] + }) + + self.assertRaises(frappe.ValidationError, template.insert) \ No newline at end of file From 3aec78b472c4db2c989379d1c12e68b71846568c Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 16:22:15 +0100 Subject: [PATCH 086/164] make due date, invoice_portion mandatory --- .../payment_terms_template_detail.json | 9 ++++++--- erpnext/controllers/accounts_controller.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json index 88babd5020a..2d1f6a0a6c6 100644 --- a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json +++ b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json @@ -81,6 +81,7 @@ "bold": 0, "collapsible": 0, "columns": 2, + "default": "0", "fieldname": "invoice_portion", "fieldtype": "Percent", "hidden": 0, @@ -101,7 +102,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -132,7 +133,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -143,6 +144,7 @@ "bold": 0, "collapsible": 0, "columns": 2, + "default": "0", "depends_on": "eval:in_list(['Day(s) after invoice date', 'Day(s) after the end of the invoice month'], doc.due_date_based_on)", "fieldname": "credit_days", "fieldtype": "Int", @@ -175,6 +177,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "default": "0", "depends_on": "eval:doc.due_date_based_on=='Month(s) after the end of the invoice month'", "fieldname": "credit_months", "fieldtype": "Int", @@ -211,7 +214,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-08-10 16:27:31.401380", + "modified": "2017-09-22 11:15:02.585019", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Terms Template Detail", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index cc624c8c3b5..16b22ce47ad 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -666,7 +666,7 @@ class AccountsController(TransactionBase): def validate_invoice_portion(self): total_portion = 0 for term in self.payment_schedule: - total_portion += term.invoice_portion + total_portion += flt(term.get('invoice_portion', 0)) if flt(total_portion, 2) != 100.00: frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red') From cf42d1db5cdf154d8eb33bf6ddf638789a6998c5 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 17:20:33 +0100 Subject: [PATCH 087/164] more tests --- .../test_payment_terms_template.py | 6 ++-- .../purchase_invoice/test_purchase_invoice.py | 9 ++++++ .../sales_invoice/test_sales_invoice.py | 8 +++++ .../purchase_order/test_purchase_order.py | 29 +++++++++++++++++++ .../doctype/quotation/test_quotation.py | 22 ++++++++++++++ .../doctype/sales_order/test_sales_order.py | 27 +++++++++++++++++ 6 files changed, 98 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py index c1b76a33ce3..bf9b75ac325 100644 --- a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py @@ -9,12 +9,12 @@ import frappe class TestPaymentTermsTemplate(unittest.TestCase): def tearDown(self): - frappe.delete_doc('Payment Terms Template', '_Test Payment Terms Template', force=1) + frappe.delete_doc('Payment Terms Template', '_Test Payment Terms Template For Test', force=1) def test_create_template(self): template = frappe.get_doc({ 'doctype': 'Payment Terms Template', - 'template_name': '_Test Payment Terms Template', + 'template_name': '_Test Payment Terms Template For Test', 'terms': [{ 'doctype': 'Payment Terms Template Detail', 'invoice_portion': 50.00, @@ -37,7 +37,7 @@ class TestPaymentTermsTemplate(unittest.TestCase): def test_credit_days(self): template = frappe.get_doc({ 'doctype': 'Payment Terms Template', - 'template_name': '_Test Payment Terms Template', + 'template_name': '_Test Payment Terms Template For Test', 'terms': [{ 'doctype': 'Payment Terms Template Detail', 'invoice_portion': 100.00, diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 83e11815070..cd5b751d015 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -636,6 +636,15 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEquals(expected_gl_entries[i][2], gle.credit) self.assertEquals(getdate(expected_gl_entries[i][3]), getdate(gle.due_date)) + def test_make_pi_without_terms(self): + pi = make_purchase_invoice(do_not_save=1) + + self.assertFalse(pi.get('payment_schedule')) + + pi.insert() + + self.assertTrue(pi.get('payment_schedule')) + def unlink_payment_on_cancel_of_invoice(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 235dec45542..5e26f52cf02 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1354,6 +1354,14 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(expected_values[gle.account][1], gle.debit) self.assertEquals(expected_values[gle.account][2], gle.credit) + def test_create_invoice_without_terms(self): + si = create_sales_invoice(do_not_save=1) + self.assertFalse(si.get('payment_schedule')) + + si.insert() + self.assertTrue(si.get('payment_schedule')) + + def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") args = frappe._dict(args) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 6e40b5defab..b672acb7e65 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -152,6 +152,35 @@ class TestPurchaseOrder(unittest.TestCase): "group_same_items": 1 }).insert(ignore_permissions=True) + def test_make_po_without_terms(self): + po = create_purchase_order(do_not_save=1) + + self.assertFalse(po.get('payment_schedule')) + + po.insert() + + self.assertTrue(po.get('payment_schedule')) + + def test_terms_does_not_copy(self): + po = create_purchase_order() + + self.assertTrue(po.get('payment_schedule')) + + pi = make_purchase_invoice(po.name) + + self.assertFalse(pi.get('payment_schedule')) + + def test_terms_copied(self): + po = create_purchase_order(do_not_save=1) + po.payment_terms_template = '_Test Payment Term Template' + po.insert() + po.submit() + self.assertTrue(po.get('payment_schedule')) + + pi = make_purchase_invoice(po.name) + pi.insert() + self.assertTrue(pi.get('payment_schedule')) + def get_same_items(): return [ diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index 7fa91b5a92e..c6a488e3cc2 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -8,7 +8,29 @@ import unittest test_dependencies = ["Product Bundle"] + class TestQuotation(unittest.TestCase): + def test_make_quotation_without_terms(self): + quotation = make_quotation(do_not_save=1) + self.assertFalse(quotation.get('payment_schedule')) + + quotation.insert() + + self.assertTrue(quotation.payment_schedule) + + def test_make_sales_order_terms_not_copied(self): + from erpnext.selling.doctype.quotation.quotation import make_sales_order + + quotation = frappe.copy_doc(test_records[0]) + quotation.transaction_date = nowdate() + quotation.valid_till = add_months(quotation.transaction_date, 1) + quotation.insert() + quotation.submit() + + sales_order = make_sales_order(quotation.name) + + self.assertFalse(sales_order.get('payment_schedule')) + def test_make_sales_order(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 8f3b14a199a..723123e95d4 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -532,6 +532,33 @@ class TestSalesOrder(unittest.TestCase): self.assertEquals(new_so.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate)) + def test_terms_auto_added(self): + so = make_sales_order(do_not_save=1) + + self.assertFalse(so.get('payment_schedule')) + + so.insert() + + self.assertTrue(so.get('payment_schedule')) + + def test_terms_not_copied(self): + so = make_sales_order() + self.assertTrue(so.get('payment_schedule')) + + si = make_sales_invoice(so.name) + self.assertFalse(si.get('payment_schedule')) + + def test_terms_copied(self): + so = make_sales_order(do_not_copy=1) + so.payment_terms_template = '_Test Payment Term Template' + so.insert() + self.assertTrue(so.get('payment_schedule')) + + si = make_sales_invoice(so.name) + si.insert() + self.assertTrue(si.get('payment_schedule')) + + def make_sales_order(**args): so = frappe.new_doc("Sales Order") args = frappe._dict(args) From 77ecacc379a9fc82d4507e45dc6f45d990324475 Mon Sep 17 00:00:00 2001 From: tunde Date: Fri, 22 Sep 2017 23:12:55 +0100 Subject: [PATCH 088/164] validation to check for possible duplicate payment terms --- .../payment_terms_template.py | 12 +++++++++ .../test_payment_terms_template.py | 25 ++++++++++++++++++- .../purchase_invoice/test_purchase_invoice.py | 7 ++++++ .../sales_invoice/test_sales_invoice.py | 7 ++++++ erpnext/controllers/accounts_controller.py | 3 +++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py index 363484d9b1a..7939d8d2253 100644 --- a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py @@ -14,6 +14,7 @@ class PaymentTermsTemplate(Document): def validate(self): self.validate_invoice_portion() self.validate_credit_days() + self.check_duplicate_terms() def validate_invoice_portion(self): total_portion = 0 @@ -28,3 +29,14 @@ class PaymentTermsTemplate(Document): if term.credit_days < 0: frappe.msgprint(_('Credit Days cannot be a negative number'), raise_exception=1, indicator='red') + def check_duplicate_terms(self): + terms = [] + for term in self.terms: + term_info = (term.credit_days, term.due_date_based_on) + if term_info in terms: + frappe.msgprint( + _('The Payment Term at row {0} is possibly a duplicate.').format(term.idx), + raise_exception=1, indicator='red' + ) + else: + terms.append(term_info) diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py index bf9b75ac325..6daaf1ed74e 100644 --- a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py @@ -46,4 +46,27 @@ class TestPaymentTermsTemplate(unittest.TestCase): }] }) - self.assertRaises(frappe.ValidationError, template.insert) \ No newline at end of file + self.assertRaises(frappe.ValidationError, template.insert) + + def test_duplicate_terms(self): + template = frappe.get_doc({ + 'doctype': 'Payment Terms Template', + 'template_name': '_Test Payment Terms Template For Test', + 'terms': [ + { + 'doctype': 'Payment Terms Template Detail', + 'invoice_portion': 50.00, + 'credit_days_based_on': 'Day(s) after invoice date', + 'credit_days': 30 + }, + { + 'doctype': 'Payment Terms Template Detail', + 'invoice_portion': 50.00, + 'credit_days_based_on': 'Day(s) after invoice date', + 'credit_days': 30 + } + + ] + }) + + self.assertRaises(frappe.ValidationError, template.insert) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index cd5b751d015..3907029b8d6 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -645,6 +645,13 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertTrue(pi.get('payment_schedule')) + def test_duplicate_due_date_in_terms(self): + pi = make_purchase_invoice(do_not_save=1) + pi.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50)) + pi.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50)) + + self.assertRaises(frappe.ValidationError, pi.insert) + def unlink_payment_on_cancel_of_invoice(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 5e26f52cf02..4d0fa90c5ae 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1361,6 +1361,13 @@ class TestSalesInvoice(unittest.TestCase): si.insert() self.assertTrue(si.get('payment_schedule')) + def test_duplicate_due_date_in_terms(self): + si = create_sales_invoice(do_not_save=1) + si.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50)) + si.append('payment_schedule', dict(due_date='2017-01-01', invoice_portion=50.00, payment_amount=50)) + + self.assertRaises(frappe.ValidationError, si.insert) + def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 16b22ce47ad..488d2215a02 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -648,12 +648,15 @@ class AccountsController(TransactionBase): self.validate_payment_schedule_amount() def validate_payment_schedule_dates(self): + dates = [] if self.due_date and getdate(self.due_date) < getdate(self.posting_date): frappe.throw(_("Due Date cannot be before posting date")) for d in self.get("payment_schedule"): if getdate(d.due_date) < getdate(self.posting_date): frappe.throw(_("Row {0}: Due Date cannot be before posting date").format(d.idx)) + elif d.due_date in dates: + frappe.throw(_("Row {0}: Duplicate due date found").format(d.idx)) def validate_payment_schedule_amount(self): total = 0 From e52bb825ecfbf2b616845a74afe44292feff4b68 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 09:02:23 +0100 Subject: [PATCH 089/164] fix bug: form is always dirty --- erpnext/controllers/accounts_controller.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 488d2215a02..6792147ee53 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -27,9 +27,10 @@ class AccountsController(TransactionBase): def onload(self): self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry') - relevant_docs = ("Quotation", "Purchase Order", "Sales Order", "Purchase Invoice", "Purchase Order") - if self.doctype in relevant_docs: - self.set_payment_schedule() + if self.is_new(): + relevant_docs = ("Quotation", "Purchase Order", "Sales Order", "Purchase Invoice", "Purchase Order") + if self.doctype in relevant_docs: + self.set_payment_schedule() def validate(self): if self.get("_action") and self._action != "update_after_submit": From 9bed2de726fd57c0e19231cd1af070eaf0e547ad Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 10:19:35 +0100 Subject: [PATCH 090/164] show all duplicate rows after checking for duplicate due date --- erpnext/controllers/accounts_controller.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 6792147ee53..9719c22cf7d 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -650,6 +650,7 @@ class AccountsController(TransactionBase): def validate_payment_schedule_dates(self): dates = [] + li = [] if self.due_date and getdate(self.due_date) < getdate(self.posting_date): frappe.throw(_("Due Date cannot be before posting date")) @@ -657,7 +658,14 @@ class AccountsController(TransactionBase): if getdate(d.due_date) < getdate(self.posting_date): frappe.throw(_("Row {0}: Due Date cannot be before posting date").format(d.idx)) elif d.due_date in dates: - frappe.throw(_("Row {0}: Duplicate due date found").format(d.idx)) + li.append('{0} in row {1}'.format(d.due_date, d.idx)) + # frappe.throw(_("Row {0}: Duplicate due date found").format(d.idx)) + dates.append(d.due_date) + + if li: + duplicates = '
' + '
'.join(li) + frappe.throw(_("Rows with duplicate due dates in other rows were found: {list}").format(list=duplicates)) + def validate_payment_schedule_amount(self): total = 0 From 90e09d4e796ae03570a42c60d619abc2836df52d Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 11:25:31 +0100 Subject: [PATCH 091/164] fix failing tests from shopping cart --- erpnext/shopping_cart/cart.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py index 5c7d825b801..5fe13c578a2 100644 --- a/erpnext/shopping_cart/cart.py +++ b/erpnext/shopping_cart/cart.py @@ -194,6 +194,7 @@ def _get_cart_quotation(party=None): "status": "Draft", "docstatus": 0, "__islocal": 1, + "payment_terms_template": "_Test Payment Terms Template", (party.doctype.lower()): party.name }) From 94c3c13ba69e984958ab030e8dc73e44cd599233 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 12:10:02 +0100 Subject: [PATCH 092/164] fix failing tests --- .../accounts/doctype/sales_invoice/test_sales_invoice.py | 2 +- erpnext/selling/doctype/sales_order/test_sales_order.py | 4 ++-- erpnext/shopping_cart/cart.py | 8 ++++++-- erpnext/shopping_cart/test_shopping_cart.py | 4 +++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 4d0fa90c5ae..3163f102be0 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1079,7 +1079,7 @@ class TestSalesInvoice(unittest.TestCase): si.items[0].price_list_rate = price_list_rate si.items[0].margin_type = 'Percentage' si.items[0].margin_rate_or_amount = 25 - si.insert() + si.save() self.assertEqual(si.get("items")[0].rate, flt((price_list_rate*25)/100 + price_list_rate)) def test_outstanding_amount_after_advance_jv_cancelation(self): diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 723123e95d4..75850d5448d 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -519,7 +519,7 @@ class TestSalesOrder(unittest.TestCase): so.items[0].price_list_rate = price_list_rate = 100 so.items[0].margin_type = 'Percentage' so.items[0].margin_rate_or_amount = 25 - so.insert() + so.save() new_so = frappe.copy_doc(so) new_so.save(ignore_permissions=True) @@ -549,7 +549,7 @@ class TestSalesOrder(unittest.TestCase): self.assertFalse(si.get('payment_schedule')) def test_terms_copied(self): - so = make_sales_order(do_not_copy=1) + so = make_sales_order(do_not_copy=1, do_not_save=1) so.payment_terms_template = '_Test Payment Term Template' so.insert() self.assertTrue(so.get('payment_schedule')) diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py index 5fe13c578a2..327acafaedd 100644 --- a/erpnext/shopping_cart/cart.py +++ b/erpnext/shopping_cart/cart.py @@ -11,7 +11,9 @@ from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings from frappe.utils.nestedset import get_root_of from erpnext.accounts.utils import get_account_name -class WebsitePriceListMissingError(frappe.ValidationError): pass + +class WebsitePriceListMissingError(frappe.ValidationError): + pass def set_cart_count(quotation=None): if cint(frappe.db.get_singles_value("Shopping Cart Settings", "enabled")): @@ -98,6 +100,7 @@ def update_cart(item_code, qty, with_items=False): apply_cart_settings(quotation=quotation) quotation.flags.ignore_permissions = True + quotation.payment_schedule = [] if not empty_card: quotation.save() else: @@ -173,6 +176,7 @@ def decorate_quotation_doc(doc): return doc + def _get_cart_quotation(party=None): '''Return the open Quotation of type "Shopping Cart" or make a new one''' if not party: @@ -194,7 +198,7 @@ def _get_cart_quotation(party=None): "status": "Draft", "docstatus": 0, "__islocal": 1, - "payment_terms_template": "_Test Payment Terms Template", + "payment_terms_template": "_Test Payment Term Template", (party.doctype.lower()): party.name }) diff --git a/erpnext/shopping_cart/test_shopping_cart.py b/erpnext/shopping_cart/test_shopping_cart.py index 22b2895043e..da049825c13 100644 --- a/erpnext/shopping_cart/test_shopping_cart.py +++ b/erpnext/shopping_cart/test_shopping_cart.py @@ -8,6 +8,9 @@ from frappe.utils import nowdate, add_months from erpnext.shopping_cart.cart import _get_cart_quotation, update_cart, get_party from erpnext.tests.utils import create_test_contact_and_address + +test_dependencies = ['Payment Terms Template'] + class TestShoppingCart(unittest.TestCase): """ Note: @@ -62,7 +65,6 @@ class TestShoppingCart(unittest.TestCase): self.assertEquals(quotation.get("items")[0].qty, 1) self.assertEquals(quotation.get("items")[0].amount, 10) - # add second item update_cart("_Test Item 2", 1) quotation = self.test_get_cart_customer() From cd9bc6f79509b8ea276621f1135307e2c189ada5 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 14:51:21 +0100 Subject: [PATCH 093/164] fix failing test --- erpnext/selling/doctype/sales_order/test_sales_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 75850d5448d..f8e7317631f 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -552,6 +552,7 @@ class TestSalesOrder(unittest.TestCase): so = make_sales_order(do_not_copy=1, do_not_save=1) so.payment_terms_template = '_Test Payment Term Template' so.insert() + so.submit() self.assertTrue(so.get('payment_schedule')) si = make_sales_invoice(so.name) From 541d3f95672c1d7364e25af1a859e212e1e16b5b Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 17:41:22 +0100 Subject: [PATCH 094/164] fix ui tests --- .../doctype/quotation/tests/test_quotation.js | 6 ++++-- ..._quotation_with_discount_on_grand_total.js | 6 ++++-- .../sales_order/tests/test_sales_order.js | 6 ++++-- ...ales_order_with_discount_on_grand_total.js | 6 ++++-- ...est_sales_order_with_item_wise_discount.js | 3 ++- erpnext/tests/ui/make_fixtures.js | 19 +++++++++++++++++++ 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation.js b/erpnext/selling/doctype/quotation/tests/test_quotation.js index 1683fa56883..37491ed8fd4 100644 --- a/erpnext/selling/doctype/quotation/tests/test_quotation.js +++ b/erpnext/selling/doctype/quotation/tests/test_quotation.js @@ -10,7 +10,8 @@ QUnit.test("test: quotation", function (assert) { {"item_code": "Test Product 1"}, {"qty": 5} ]] - } + }, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => { @@ -18,7 +19,7 @@ QUnit.test("test: quotation", function (assert) { assert.ok(cur_frm.doc.items[0].item_name == "Test Product 1", "Added Test Product 1"); // calculate_taxes_and_totals - assert.ok(cur_frm.doc.grand_total === 500, "Total Amount is correct"); + assert.ok(cur_frm.doc.grand_total === 500, String(cur_frm.doc.grand_total)); }, () => cur_frm.set_value("customer_address", "Test1-Billing"), () => cur_frm.set_value("shipping_address_name", "Test1-Warehouse"), @@ -30,6 +31,7 @@ QUnit.test("test: quotation", function (assert) { () => cur_frm.doc.items[0].rate = 200, () => frappe.timeout(0.3), () => cur_frm.set_value("tc_name", "Test Term 1"), + () => cur_frm.set_value("payment_schedule", []), () => frappe.timeout(0.5), () => cur_frm.save(), () => { diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js index b7b5a470d69..aeb5d1b9eb7 100644 --- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js +++ b/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js @@ -16,13 +16,15 @@ QUnit.test("test quotation with additional discount in grand total", function(as ]}, {customer_address: 'Test1-Billing'}, {shipping_address_name: 'Test1-Shipping'}, - {contact_person: 'Contact 1-Test Customer 1'} + {contact_person: 'Contact 1-Test Customer 1'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => { return frappe.tests.set_form_values(cur_frm, [ {apply_discount_on:'Grand Total'}, - {additional_discount_percentage:10} + {additional_discount_percentage:10}, + {payment_schedule: []} ]); }, () => cur_frm.save(), diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js index daa81318818..12661e3663f 100644 --- a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js +++ b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js @@ -19,13 +19,15 @@ QUnit.test("test sales order", function(assert) { {contact_person: 'Contact 1-Test Customer 1'}, {taxes_and_charges: 'TEST In State GST'}, {tc_name: 'Test Term 1'}, - {terms: 'This is Test'} + {terms: 'This is Test'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => { return frappe.tests.set_form_values(cur_frm, [ {selling_price_list:'Test-Selling-USD'}, - {currency: 'USD'} + {currency: 'USD'}, + {payment_schedule: []} ]); }, () => frappe.timeout(1), diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js index 3247c85d971..de61a6112c1 100644 --- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js +++ b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js @@ -16,13 +16,15 @@ QUnit.test("test sales order with additional discount in grand total", function( ]}, {customer_address: 'Test1-Billing'}, {shipping_address_name: 'Test1-Shipping'}, - {contact_person: 'Contact 1-Test Customer 1'} + {contact_person: 'Contact 1-Test Customer 1'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => { return frappe.tests.set_form_values(cur_frm, [ {apply_discount_on:'Grand Total'}, - {additional_discount_percentage:10} + {additional_discount_percentage:10}, + {payment_schedule: []} ]); }, () => cur_frm.save(), diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js index c745374fcc1..2c481083086 100644 --- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js +++ b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js @@ -18,7 +18,8 @@ QUnit.test("test sales order", function(assert) { ]}, {customer_address: 'Test1-Billing'}, {shipping_address_name: 'Test1-Shipping'}, - {contact_person: 'Contact 1-Test Customer 1'} + {contact_person: 'Contact 1-Test Customer 1'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => cur_frm.save(), diff --git a/erpnext/tests/ui/make_fixtures.js b/erpnext/tests/ui/make_fixtures.js index 0bd74915c29..78ec8f16dbf 100644 --- a/erpnext/tests/ui/make_fixtures.js +++ b/erpnext/tests/ui/make_fixtures.js @@ -217,6 +217,25 @@ $.extend(frappe.test_data, { {price_list: '_Test Price List'}, {price_list_rate: 200} ] + }, + "Payment Term": { + "_Test Payment Term": [ + {payment_term_name: '_Test Payment Term'}, + {due_date_based_on: 'Day(s) after invoice date'}, + {invoice_portion: 100}, + {credit_days: 0} + ] + }, + "Payment Terms Template": { + "_Test Payment Term Template UI": [ + {template_name: "_Test Payment Term Template UI"}, + {terms: [ + [ + {payment_term: '_Test Payment Term'}, + {invoice_portion: 100} + ] + ]} + ] } }); From 31ddbe36c043c84f1a2ff419522c6c4caaa1eb87 Mon Sep 17 00:00:00 2001 From: tunde Date: Mon, 25 Sep 2017 23:24:32 +0100 Subject: [PATCH 095/164] fix bug: cast to flt --- .../payment_terms_template/payment_terms_template.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py index 7939d8d2253..7042df05942 100644 --- a/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/payment_terms_template.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -from frappe.utils import flt +from frappe.utils import flt, cint from frappe import _ @@ -19,14 +19,14 @@ class PaymentTermsTemplate(Document): def validate_invoice_portion(self): total_portion = 0 for term in self.terms: - total_portion += term.invoice_portion + total_portion += flt(term.get('invoice_portion', 0)) if flt(total_portion, 2) != 100.00: frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red') def validate_credit_days(self): for term in self.terms: - if term.credit_days < 0: + if cint(term.credit_days) < 0: frappe.msgprint(_('Credit Days cannot be a negative number'), raise_exception=1, indicator='red') def check_duplicate_terms(self): From c4b0d17c087eaccfe1836274af7ed61e0150b4c7 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 26 Sep 2017 00:48:30 +0100 Subject: [PATCH 096/164] fix bug: can't make PE for invoice with multi due date --- .../doctype/payment_entry/payment_entry.py | 19 ++++---- .../payment_entry/test_payment_entry.py | 19 ++++++-- erpnext/accounts/utils.py | 46 ++++++++++--------- 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 406dfbc9d1f..bbffc9a2b63 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -8,14 +8,16 @@ from frappe import _, scrub, ValidationError from frappe.utils import flt, comma_or, nowdate from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on from erpnext.accounts.party import get_party_account -from erpnext.accounts.doctype.journal_entry.journal_entry \ - import get_average_exchange_rate, get_default_bank_cash_account +from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account from erpnext.setup.utils import get_exchange_rate from erpnext.accounts.general_ledger import make_gl_entries from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount from erpnext.controllers.accounts_controller import AccountsController -class InvalidPaymentEntry(ValidationError): pass + +class InvalidPaymentEntry(ValidationError): + pass + class PaymentEntry(AccountsController): def setup_party_account_field(self): @@ -69,10 +71,9 @@ class PaymentEntry(AccountsController): def validate_duplicate_entry(self): reference_names = [] for d in self.get("references"): - if (d.reference_doctype, d.reference_name) in reference_names: + if (d.reference_doctype, d.reference_name, d.due_date) in reference_names: frappe.throw(_("Row #{0}: Duplicate entry in References {1} {2}").format(d.idx, d.reference_doctype, d.reference_name)) - reference_names.append((d.reference_doctype, d.reference_name)) - + reference_names.append((d.reference_doctype, d.reference_name, d.due_date)) def validate_allocated_amount(self): for d in self.get("references"): @@ -80,7 +81,6 @@ class PaymentEntry(AccountsController): if flt(d.allocated_amount) > flt(d.outstanding_amount): frappe.throw(_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx)) - def delink_advance_entry_references(self): for reference in self.references: if reference.reference_doctype in ("Sales Invoice", "Purchase Invoice"): @@ -128,7 +128,6 @@ class PaymentEntry(AccountsController): self.set_missing_ref_details() - def set_missing_ref_details(self): for d in self.get("references"): if d.allocated_amount: @@ -594,8 +593,8 @@ def get_negative_outstanding_invoices(party_type, party, party_account, total_fi "total_field": total_field, "voucher_type": voucher_type, "party_type": scrub(party_type), - "party_account": "debit_to" if party_type=="Customer" else "credit_to" - }), (party, party_account), as_dict = True) + "party_account": "debit_to" if party_type == "Customer" else "credit_to" + }), (party, party_account), as_dict=True) else: return [] diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index 3264bbb5ee8..a3a78a33e7d 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -14,6 +14,7 @@ from erpnext.hr.doctype.expense_claim.test_expense_claim import make_expense_cla test_dependencies = ["Item"] + class TestPaymentEntry(unittest.TestCase): def test_payment_entry_against_order(self): so = make_sales_order() @@ -40,7 +41,7 @@ class TestPaymentEntry(unittest.TestCase): self.assertEqual(so_advance_paid, 0) def test_payment_entry_against_si_usd_to_usd(self): - si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC", + si = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC", currency="USD", conversion_rate=50) pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Bank USD - _TC") pe.reference_no = "1" @@ -65,8 +66,20 @@ class TestPaymentEntry(unittest.TestCase): outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount")) self.assertEqual(outstanding_amount, 100) + def test_payment_entry_against_si_multi_due_dates(self): + si = create_sales_invoice(do_not_save=1) + si.payment_terms_template = '_Test Payment Term Template' + si.insert() + si.submit() + + pe = get_payment_entry(si.doctype, si.name) + pe.reference_no = "1" + pe.reference_date = "2016-01-01" + pe.insert() + pe.submit() + def test_payment_entry_against_pi(self): - pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC", + pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC", currency="USD", conversion_rate=50) pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Bank USD - _TC") pe.reference_no = "1" @@ -88,7 +101,7 @@ class TestPaymentEntry(unittest.TestCase): def test_payment_entry_against_ec(self): payable = frappe.db.get_value('Company', "_Test Company", 'default_payable_account') - ec = make_expense_claim(payable, 300, 300, "_Test Company","Travel Expenses - _TC") + ec = make_expense_claim(payable, 300, 300, "_Test Company", "Travel Expenses - _TC") pe = get_payment_entry("Expense Claim", ec.name, bank_account="_Test Bank USD - _TC", bank_amount=300) pe.reference_no = "1" pe.reference_date = "2016-01-01" diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 6d6acedd3b6..6a817887bde 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -569,11 +569,12 @@ def get_stock_rbnb_difference(posting_date, company): # Amount should be credited return flt(stock_rbnb) + flt(sys_bal) + def get_outstanding_invoices(party_type, party, account, condition=None): outstanding_invoices = [] precision = frappe.get_precision("Sales Invoice", "outstanding_amount") - if party_type=="Customer": + if party_type == "Customer": dr_or_cr = "debit_in_account_currency - credit_in_account_currency" payment_dr_or_cr = "payment_gl_entry.credit_in_account_currency - payment_gl_entry.debit_in_account_currency" else: @@ -584,11 +585,6 @@ def get_outstanding_invoices(party_type, party, account, condition=None): invoice_list = frappe.db.sql(""" select voucher_no, voucher_type, posting_date, ifnull(sum({dr_or_cr}), 0) as invoice_amount, due_date, - ( - case when (voucher_type = 'Sales Invoice' or voucher_type = 'Purchase Invoice') - then (select due_date from `tab{invoice}` where name = voucher_no) - else posting_date end - ) as due_date, ( select ifnull(sum({payment_dr_or_cr}), 0) from `tabGL Entry` payment_gl_entry @@ -612,10 +608,10 @@ def get_outstanding_invoices(party_type, party, account, condition=None): group by voucher_type, voucher_no, due_date having (invoice_amount - payment_amount) > 0.005 order by posting_date, name, due_date""".format( - dr_or_cr = dr_or_cr, - invoice = invoice, - payment_dr_or_cr = payment_dr_or_cr, - condition = condition or "" + dr_or_cr=dr_or_cr, + invoice=invoice, + payment_dr_or_cr=payment_dr_or_cr, + condition=condition or "" ), { "party_type": party_type, "party": party, @@ -623,18 +619,24 @@ def get_outstanding_invoices(party_type, party, account, condition=None): }, as_dict=True) for d in invoice_list: - due_date = d.due_date or (frappe.db.get_value(d.voucher_type, d.voucher_no, - "posting_date" if party_type=="Employee" else "due_date")) - outstanding_invoices.append(frappe._dict({ - 'voucher_no': d.voucher_no, - 'voucher_type': d.voucher_type, - 'due_date': d.due_date, - 'posting_date': d.posting_date, - 'invoice_amount': flt(d.invoice_amount), - 'payment_amount': flt(d.payment_amount), - 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision), - 'due_date': due_date - })) + due_date = d.due_date or ( + frappe.db.get_value( + d.voucher_type, d.voucher_no, + "posting_date" if party_type == "Employee" else "due_date" + ) + ) + + outstanding_invoices.append( + frappe._dict({ + 'voucher_no': d.voucher_no, + 'voucher_type': d.voucher_type, + 'posting_date': d.posting_date, + 'invoice_amount': flt(d.invoice_amount), + 'payment_amount': flt(d.payment_amount), + 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision), + 'due_date': due_date + }) + ) outstanding_invoices = sorted(outstanding_invoices, key=lambda k: k['due_date'] or getdate(nowdate())) From 192587fe56e6ec5a106769e1d4084035f7cbff42 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 26 Sep 2017 01:32:08 +0100 Subject: [PATCH 097/164] UI test cases --- .../doctype/purchase_invoice/test_purchase_invoice.js | 6 +++++- .../doctype/sales_invoice/test_sales_invoice.js | 10 +++++++--- .../tests/test_sales_invoice_with_payment.js | 4 +++- .../selling/doctype/quotation/tests/test_quotation.js | 5 ++++- .../doctype/sales_order/tests/test_sales_order.js | 5 ++++- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js index 6e33e1d7f2c..06a3e28d25e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js @@ -19,7 +19,8 @@ QUnit.test("test purchase invoice", function(assert) { {contact_person: 'Contact 3-Test Supplier'}, {taxes_and_charges: 'TEST In State GST'}, {tc_name: 'Test Term 1'}, - {terms: 'This is Test'} + {terms: 'This is Test'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => cur_frm.save(), @@ -33,6 +34,9 @@ QUnit.test("test purchase invoice", function(assert) { // grand_total Calculated assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct"); + assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); + assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); + }, () => frappe.tests.click_button('Submit'), () => frappe.tests.click_button('Yes'), diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js index f7a4488cd17..b4be3ba67cb 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js @@ -1,7 +1,7 @@ QUnit.module('Sales Invoice'); QUnit.test("test sales Invoice", function(assert) { - assert.expect(4); + assert.expect(6); let done = assert.async(); frappe.run_serially([ () => { @@ -19,7 +19,8 @@ QUnit.test("test sales Invoice", function(assert) { {contact_person: 'Contact 1-Test Customer 1'}, {taxes_and_charges: 'TEST In State GST'}, {tc_name: 'Test Term 1'}, - {terms: 'This is Test'} + {terms: 'This is Test'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => cur_frm.save(), @@ -31,7 +32,10 @@ QUnit.test("test sales Invoice", function(assert) { // get tax account head details assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct"); // grand_total Calculated - assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct"); + assert.ok(cur_frm.doc.grand_total==590, "Grand Total correct"); + + assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); + assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); }, () => frappe.tests.click_button('Submit'), diff --git a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js index 736443e2609..14c0d55bd8a 100644 --- a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js +++ b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js @@ -19,7 +19,8 @@ QUnit.test("test sales Invoice with payment", function(assert) { {contact_person: 'Contact 1-Test Customer 1'}, {taxes_and_charges: 'TEST In State GST'}, {tc_name: 'Test Term 1'}, - {terms: 'This is Test'} + {terms: 'This is Test'}, + {payment_terms_template: '_Test Payment Term Template UI'} ]); }, () => cur_frm.save(), @@ -43,6 +44,7 @@ QUnit.test("test sales Invoice with payment", function(assert) { () => { cur_frm.set_value('paid_to','Cash - '+frappe.get_abbr(frappe.defaults.get_default('Company')));}, () => {cur_frm.set_value('reference_no','TEST1234');}, () => {cur_frm.set_value('reference_date',frappe.datetime.add_days(frappe.datetime.nowdate(), 0));}, + () => cur_frm.set_value("payment_schedule", []), () => cur_frm.save(), () => { // get payment details diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation.js b/erpnext/selling/doctype/quotation/tests/test_quotation.js index 37491ed8fd4..d69d799d0de 100644 --- a/erpnext/selling/doctype/quotation/tests/test_quotation.js +++ b/erpnext/selling/doctype/quotation/tests/test_quotation.js @@ -1,5 +1,5 @@ QUnit.test("test: quotation", function (assert) { - assert.expect(10); + assert.expect(12); let done = assert.async(); frappe.run_serially([ () => { @@ -49,6 +49,9 @@ QUnit.test("test: quotation", function (assert) { // Check Terms and Condtions assert.ok(cur_frm.doc.tc_name == "Test Term 1", "Terms and Conditions Checked"); + assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); + assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); + }, () => done() ]); diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js index 12661e3663f..8e813db7ad2 100644 --- a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js +++ b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js @@ -1,7 +1,7 @@ QUnit.module('Sales Order'); QUnit.test("test sales order", function(assert) { - assert.expect(10); + assert.expect(12); let done = assert.async(); frappe.run_serially([ () => { @@ -50,6 +50,9 @@ QUnit.test("test sales order", function(assert) { () => cur_frm.print_doc(), () => frappe.timeout(1), () => { + assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); + assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); + assert.ok($('.btn-print-print').is(':visible'), "Print Format Available"); frappe.timeout(1); assert.ok($(".section-break+ .section-break .column-break:nth-child(1) .data-field:nth-child(1) .value").text().includes("Billing Street 1"), "Print Preview Works As Expected"); From 9e4dcdfbc81efc42d01ae2c2fd6bb597fb89dd00 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 26 Sep 2017 09:33:06 +0100 Subject: [PATCH 098/164] rename Payment Terms Schedule section break to Payment Terms --- .../doctype/purchase_invoice/purchase_invoice.json | 7 ++++--- .../accounts/doctype/sales_invoice/sales_invoice.json | 8 ++++---- .../buying/doctype/purchase_order/purchase_order.json | 10 +++++----- erpnext/selling/doctype/quotation/quotation.json | 10 +++++----- erpnext/selling/doctype/sales_order/sales_order.json | 10 +++++----- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 163fb526156..bac0e998700 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2793,6 +2793,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 1, + "collapsible_depends_on": "eval:(!doc.is_return)", "columns": 0, "fieldname": "payment_schedule_section", "fieldtype": "Section Break", @@ -2803,7 +2804,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payment Terms Schedule", + "label": "Payment Terms", "length": 0, "no_copy": 0, "permlevel": 0, @@ -4012,8 +4013,8 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-09-19 11:22:47.074420", - "modified_by": "Administrator", + "modified": "2017-09-26 04:40:05.304278", + "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", "name_case": "Title Case", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 9dbb06d4784..34768c40801 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2763,7 +2763,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payment Schedule", + "label": "Payment Terms", "length": 0, "no_copy": 0, "permlevel": 0, @@ -4908,9 +4908,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "menu_index": 0, - "modified": "2017-09-19 11:23:08.675028", - "modified_by": "Administrator", + "menu_index": 0, + "modified": "2017-09-26 04:35:56.069952", + "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", "name_case": "Title Case", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 1e55f920538..0c19d2b41ad 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2354,7 +2354,7 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 1, + "collapsible": 0, "columns": 0, "fieldname": "payment_schedule_section", "fieldtype": "Section Break", @@ -2365,7 +2365,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payment Terms Schedule", + "label": "Payment Terms", "length": 0, "no_copy": 0, "permlevel": 0, @@ -3549,9 +3549,9 @@ "is_submittable": 1, "issingle": 0, "istable": 0, - "max_attachments": 0, - "modified": "2017-09-19 11:22:30.190589", - "modified_by": "Administrator", + "max_attachments": 0, + "modified": "2017-09-26 04:41:49.329626", + "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", "owner": "Administrator", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 0562c780f39..7fbdf26753f 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2155,8 +2155,8 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "eval:!doc.__islocal", + "collapsible": 0, + "collapsible_depends_on": "", "columns": 0, "depends_on": "", "fieldname": "payment_schedule_section", @@ -2168,7 +2168,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payment Schedule", + "label": "Payment Terms", "length": 0, "no_copy": 0, "permlevel": 0, @@ -2850,9 +2850,9 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-09-19 11:22:15.268846", + "modified": "2017-09-26 04:43:59.901399", "modified_by": "Administrator", - "module": "Selling", + "module": "Selling", "name": "Quotation", "owner": "Administrator", "permissions": [ diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 2b996393f17..97c5996ba86 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2335,8 +2335,8 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "eval:!doc.__islocal||doc.payment_schedule", + "collapsible": 0, + "collapsible_depends_on": "", "columns": 0, "fieldname": "payment_schedule_section", "fieldtype": "Section Break", @@ -2347,7 +2347,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Payment Terms Schedule", + "label": "Payment Terms", "length": 0, "no_copy": 0, "permlevel": 0, @@ -3875,9 +3875,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-19 11:21:36.332326", + "modified": "2017-09-26 04:43:20.642507", "modified_by": "Administrator", - "module": "Selling", + "module": "Selling", "name": "Sales Order", "owner": "Administrator", "permissions": [ From 095cfc9cfc18d7959e6c906bdb61dc3e6c66cdd3 Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 26 Sep 2017 10:25:49 +0100 Subject: [PATCH 099/164] disable some Payment Schedule fields --- .../doctype/payment_schedule/payment_schedule.json | 10 +++++----- .../payment_terms_template_detail.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json index 45a81b0ab47..b068f216ce1 100644 --- a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json +++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json @@ -67,7 +67,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -98,7 +98,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, @@ -129,7 +129,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -160,7 +160,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, @@ -179,7 +179,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-08-10 18:09:42.122027", + "modified": "2017-09-26 05:13:54.187475", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Schedule", diff --git a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json index 2d1f6a0a6c6..f808a0f8637 100644 --- a/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json +++ b/erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json @@ -214,7 +214,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-09-22 11:15:02.585019", + "modified": "2017-09-26 05:21:51.738319", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Terms Template Detail", From 79f9a4aef104b7c52b58c3e869fde0b15e61c59f Mon Sep 17 00:00:00 2001 From: tunde Date: Tue, 26 Sep 2017 10:39:30 +0100 Subject: [PATCH 100/164] bug fix: sales invoice always dirty even after reloading --- erpnext/public/js/controllers/transaction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 9164f07b917..c0dcd3282ad 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1131,7 +1131,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ payment_terms_template: function() { var me = this; - if(this.frm.doc.payment_terms_template) { + if(this.frm.doc.payment_terms_template && this.frm.doc.payment_schedule.length === 0) { frappe.call({ method: "erpnext.controllers.accounts_controller.get_payment_terms", args: { From d348c12bdba4f8173408ddac8c0bdd56dc420eb4 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 28 Sep 2017 09:46:31 +0100 Subject: [PATCH 101/164] fix sales order ui test --- .../sales_order/tests/test_sales_order.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js index 8e813db7ad2..939261c0c55 100644 --- a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js +++ b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js @@ -26,11 +26,10 @@ QUnit.test("test sales order", function(assert) { () => { return frappe.tests.set_form_values(cur_frm, [ {selling_price_list:'Test-Selling-USD'}, - {currency: 'USD'}, - {payment_schedule: []} + {currency: 'USD'} ]); }, - () => frappe.timeout(1), + () => frappe.timeout(1.5), () => { // get_item_details assert.ok(cur_frm.doc.items[0].item_name=='Test Product 3', "Item name correct"); @@ -38,21 +37,24 @@ QUnit.test("test sales order", function(assert) { assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST', "Tax details correct"); // get tax account head details assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct"); - // calculate totals - assert.ok(cur_frm.doc.items[0].price_list_rate==250, "Item 1 price_list_rate"); - assert.ok(cur_frm.doc.net_total== 1280.75, "net total correct "); - assert.ok(cur_frm.doc.base_grand_total== flt(1511.29* cur_frm.doc.conversion_rate, precision('base_grand_total')), "base round total correct "); - assert.ok(cur_frm.doc.grand_total== 1511.29 , "grand total correct "); - assert.ok(cur_frm.doc.rounded_total== 1511.30, "rounded total correct "); }, () => cur_frm.save(), () => frappe.timeout(1), () => cur_frm.print_doc(), () => frappe.timeout(1), () => { + // Payment Terms assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct"); assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty"); + // totals + assert.ok(cur_frm.doc.items[0].price_list_rate==250, "Item 1 price_list_rate"); + assert.ok(cur_frm.doc.net_total== 1280.75, "net total correct "); + assert.ok(cur_frm.doc.base_grand_total== flt(1511.29* cur_frm.doc.conversion_rate, precision('base_grand_total')), String(flt(1511.29* cur_frm.doc.conversion_rate, precision('base_grand_total')) + ' ' + cur_frm.doc.base_grand_total)); + assert.ok(cur_frm.doc.grand_total== 1511.29 , "grand total correct "); + assert.ok(cur_frm.doc.rounded_total== 1511.30, "rounded total correct "); + + // print format assert.ok($('.btn-print-print').is(':visible'), "Print Format Available"); frappe.timeout(1); assert.ok($(".section-break+ .section-break .column-break:nth-child(1) .data-field:nth-child(1) .value").text().includes("Billing Street 1"), "Print Preview Works As Expected"); From 18764a12c438b8849fd7fcb3dfc3bbf18b2c6ce0 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 28 Sep 2017 11:47:27 +0100 Subject: [PATCH 102/164] increase point-of-sale timeout to fix UI test --- erpnext/selling/page/point_of_sale/tests/test_point_of_sale.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/page/point_of_sale/tests/test_point_of_sale.js b/erpnext/selling/page/point_of_sale/tests/test_point_of_sale.js index c70d076c70a..79d1700b4ed 100644 --- a/erpnext/selling/page/point_of_sale/tests/test_point_of_sale.js +++ b/erpnext/selling/page/point_of_sale/tests/test_point_of_sale.js @@ -4,7 +4,7 @@ QUnit.test("test:Point of Sales", function(assert) { frappe.run_serially([ () => frappe.set_route('point-of-sale'), - () => frappe.timeout(2), + () => frappe.timeout(3), () => frappe.set_control('customer', 'Test Customer 1'), () => frappe.timeout(0.2), () => cur_frm.set_value('customer', 'Test Customer 1'), From 131f0104b00df6ebf58eb4a528194932c9e7e841 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 28 Sep 2017 11:50:38 +0100 Subject: [PATCH 103/164] fix production order ui test --- .../production_order/test_production_order.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.js b/erpnext/manufacturing/doctype/production_order/test_production_order.js index 7ce67ba4304..7b6f11ed0e2 100644 --- a/erpnext/manufacturing/doctype/production_order/test_production_order.js +++ b/erpnext/manufacturing/doctype/production_order/test_production_order.js @@ -16,7 +16,7 @@ QUnit.test("test: production order", function (assert) { frappe.run_serially([ // test production order () => frappe.set_route("List", "Production Order"), - () => frappe.timeout(0.5), + () => frappe.timeout(3), // Create a laptop production order () => { @@ -29,7 +29,7 @@ QUnit.test("test: production order", function (assert) { {fg_warehouse: "Finished Goods - FT"} ]); }, - () => frappe.timeout(2), + () => frappe.timeout(3), () => { assert.equal(cur_frm.doc.planned_operating_cost, cur_frm.doc.total_operating_cost, "Total and Planned Cost is equal"); @@ -54,22 +54,25 @@ QUnit.test("test: production order", function (assert) { () => cur_frm.savesubmit(), () => frappe.timeout(1), () => frappe.click_button('Yes'), - () => frappe.timeout(1), + () => frappe.timeout(2.5), // Confirm the production order timesheet, save and submit it - () => frappe.click_link("TS-00"), - () => frappe.timeout(1), + () => frappe.click_link("Timesheet"), + () => frappe.timeout(2.5), + () => { + let name = cur_list.data[0].name; + frappe.click_link(name); + }, + () => frappe.timeout(2.5), () => frappe.click_button("Save"), () => frappe.timeout(1), () => frappe.click_button("Submit"), () => frappe.timeout(1), () => frappe.click_button("Yes"), - () => frappe.timeout(2), + () => frappe.timeout(2.5), // Start the production order process () => frappe.set_route("List", "Production Order"), - () => frappe.timeout(.5), - () => frappe.set_route("List", "Production Order"), () => frappe.timeout(2), () => frappe.click_link("Laptop"), () => frappe.timeout(1), From 21e371f65fea3f671fbf0cf0ce5233a0c0f1141a Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 28 Sep 2017 14:57:41 +0100 Subject: [PATCH 104/164] use chromedriver 3.2 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8681c03f55d..66753374c7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ install: - cp -r $TRAVIS_BUILD_DIR/test_sites/test_site ~/frappe-bench/sites/ before_script: - - wget http://chromedriver.storage.googleapis.com/2.27/chromedriver_linux64.zip + - wget http://chromedriver.storage.googleapis.com/2.32/chromedriver_linux64.zip - unzip chromedriver_linux64.zip - sudo apt-get install libnss3 - sudo apt-get --only-upgrade install google-chrome-stable From f65e55064baba1731cf552914db1b37222d9b2fd Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 29 Sep 2017 16:38:17 +0530 Subject: [PATCH 105/164] Fixed ui tests for production order --- .../doctype/production_order/test_production_order.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.js b/erpnext/manufacturing/doctype/production_order/test_production_order.js index 7b6f11ed0e2..670f0b06bf6 100644 --- a/erpnext/manufacturing/doctype/production_order/test_production_order.js +++ b/erpnext/manufacturing/doctype/production_order/test_production_order.js @@ -57,14 +57,7 @@ QUnit.test("test: production order", function (assert) { () => frappe.timeout(2.5), // Confirm the production order timesheet, save and submit it - () => frappe.click_link("Timesheet"), - () => frappe.timeout(2.5), - () => { - let name = cur_list.data[0].name; - frappe.click_link(name); - }, - () => frappe.timeout(2.5), - () => frappe.click_button("Save"), + () => frappe.click_link("TS-00"), () => frappe.timeout(1), () => frappe.click_button("Submit"), () => frappe.timeout(1), From 6575a615b16db80e76f9c1df355e23f18d169950 Mon Sep 17 00:00:00 2001 From: tunde Date: Thu, 26 Oct 2017 14:30:18 +0100 Subject: [PATCH 106/164] get attribute with get method --- erpnext/stock/doctype/item/item.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 4b4f15bf417..bf8eaba0a24 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -57,7 +57,7 @@ class Item(WebsiteGenerator): if not self.description: self.description = self.item_name - if self.is_sales_item and not self.is_item_from_hub: + if self.is_sales_item and not self.get('is_item_from_hub'): self.publish_in_hub = 1 def after_insert(self): From 21cbbae88fc1154ba0937e672d185b215edef1de Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 16 Nov 2017 14:05:57 +0530 Subject: [PATCH 107/164] [fix] Payment reconcillation showing linked journal entries (#11611) --- erpnext/accounts/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index f7aa341e122..bcce6a16138 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -593,7 +593,9 @@ def get_outstanding_invoices(party_type, party, account, condition=None): select ifnull(sum({payment_dr_or_cr}), 0) from `tabGL Entry` payment_gl_entry where payment_gl_entry.against_voucher_type = invoice_gl_entry.voucher_type - and payment_gl_entry.against_voucher = invoice_gl_entry.against_voucher + and if(invoice_gl_entry.voucher_type='Journal Entry', + payment_gl_entry.against_voucher = invoice_gl_entry.voucher_no, + payment_gl_entry.against_voucher = invoice_gl_entry.against_voucher) and payment_gl_entry.party_type = invoice_gl_entry.party_type and payment_gl_entry.party = invoice_gl_entry.party and payment_gl_entry.account = invoice_gl_entry.account From 0df93d61ebd68f865d4256f10e16931cd1775f51 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Thu, 16 Nov 2017 14:07:55 +0530 Subject: [PATCH 108/164] Update update_sales_cost_in_project.py (#11595) Will break if select sum(base_grand_total) from `tabSales Order` where project=p.name and docstatus=1 returns Null. Gives - "OperationalError: (1048, "Column 'total_sales_cost' cannot be null")" Error --- erpnext/patches/v8_0/update_sales_cost_in_project.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/patches/v8_0/update_sales_cost_in_project.py b/erpnext/patches/v8_0/update_sales_cost_in_project.py index cc3798e0565..8f3aa262410 100644 --- a/erpnext/patches/v8_0/update_sales_cost_in_project.py +++ b/erpnext/patches/v8_0/update_sales_cost_in_project.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2013, Frappé Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals @@ -7,6 +7,6 @@ import frappe def execute(): frappe.db.sql(""" update `tabProject` p - set total_sales_cost = (select sum(base_grand_total) - from `tabSales Order` where project=p.name and docstatus=1) - """) \ No newline at end of file + set total_sales_cost = ifnull((select sum(base_grand_total) + from `tabSales Order` where project=p.name and docstatus=1), 0) + """) From bda07c6db4bc9501b9b9c47317bd5210e7f4480d Mon Sep 17 00:00:00 2001 From: Pawan Mehta Date: Thu, 16 Nov 2017 14:09:17 +0530 Subject: [PATCH 109/164] Added Warehouse, Cost Center, Owner filters to Sales Register (#11600) * [fix] #3668 * fix codacy space issue --- .../report/sales_register/sales_register.js | 18 +++++++ .../report/sales_register/sales_register.py | 47 ++++++++++++++++--- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/report/sales_register/sales_register.js b/erpnext/accounts/report/sales_register/sales_register.js index 0495976cf18..db74626c1f5 100644 --- a/erpnext/accounts/report/sales_register/sales_register.js +++ b/erpnext/accounts/report/sales_register/sales_register.js @@ -34,6 +34,24 @@ frappe.query_reports["Sales Register"] = { "label": __("Mode of Payment"), "fieldtype": "Link", "options": "Mode of Payment" + }, + { + "fieldname":"owner", + "label": __("Owner"), + "fieldtype": "Link", + "options": "User" + }, + { + "fieldname":"cost_center", + "label": __("Cost Center"), + "fieldtype": "Link", + "options": "Cost Center" + }, + { + "fieldname":"warehouse", + "label": __("Warehouse"), + "fieldtype": "Link", + "options": "Warehouse" } ] } diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py index c471b8b08fb..ace8d549167 100644 --- a/erpnext/accounts/report/sales_register/sales_register.py +++ b/erpnext/accounts/report/sales_register/sales_register.py @@ -22,7 +22,8 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No invoice_income_map = get_invoice_income_map(invoice_list) invoice_income_map, invoice_tax_map = get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts) - + #Cost Center & Warehouse Map + invoice_cc_wh_map = get_invoice_cc_wh_map(invoice_list) invoice_so_dn_map = get_invoice_so_dn_map(invoice_list) customers = list(set([inv.customer for inv in invoice_list])) customer_map = get_customer_details(customers) @@ -34,6 +35,8 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No # invoice details sales_order = list(set(invoice_so_dn_map.get(inv.name, {}).get("sales_order", []))) delivery_note = list(set(invoice_so_dn_map.get(inv.name, {}).get("delivery_note", []))) + cost_center = list(set(invoice_cc_wh_map.get(inv.name, {}).get("cost_center", []))) + warehouse = list(set(invoice_cc_wh_map.get(inv.name, {}).get("warehouse", []))) customer_details = customer_map.get(inv.customer, {}) row = [ @@ -48,8 +51,9 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No customer_details.get("customer_group"), customer_details.get("territory"), inv.debit_to, ", ".join(mode_of_payments.get(inv.name, [])), - inv.project, inv.remarks, - ", ".join(sales_order), ", ".join(delivery_note), company_currency + inv.project, inv.owner, inv.remarks, + ", ".join(sales_order), ", ".join(delivery_note),", ".join(cost_center), + ", ".join(warehouse), company_currency ] # map income values base_net_total = 0 @@ -89,8 +93,9 @@ def get_columns(invoice_list, additional_table_columns): columns +=[ _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80", _("Receivable Account") + ":Link/Account:120", _("Mode of Payment") + "::120", - _("Project") +":Link/Project:80", _("Remarks") + "::150", + _("Project") +":Link/Project:80", _("Owner") + "::150", _("Remarks") + "::150", _("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100", + _("Cost Center") + ":Link/Cost Center:100", _("Warehouse") + ":Link/Warehouse:100", { "fieldname": "currency", "label": _("Currency"), @@ -133,11 +138,23 @@ def get_conditions(filters): if filters.get("from_date"): conditions += " and posting_date >= %(from_date)s" if filters.get("to_date"): conditions += " and posting_date <= %(to_date)s" + if filters.get("owner"): conditions += " and owner = %(owner)s" + if filters.get("mode_of_payment"): conditions += """ and exists(select name from `tabSales Invoice Payment` where parent=`tabSales Invoice`.name and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)""" + if filters.get("cost_center"): + conditions += """ and exists(select name from `tabSales Invoice Item` + where parent=`tabSales Invoice`.name + and ifnull(`tabSales Invoice Item`.cost_center, '') = %(cost_center)s)""" + + if filters.get("warehouse"): + conditions += """ and exists(select name from `tabSales Invoice Item` + where parent=`tabSales Invoice`.name + and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s)""" + return conditions def get_invoices(filters, additional_query_columns): @@ -145,7 +162,7 @@ def get_invoices(filters, additional_query_columns): additional_query_columns = ', ' + ', '.join(additional_query_columns) conditions = get_conditions(filters) - return frappe.db.sql("""select name, posting_date, debit_to, project, customer, customer_name, remarks, + return frappe.db.sql("""select name, posting_date, debit_to, project, customer, customer_name, owner, remarks, base_net_total, base_grand_total, base_rounded_total, outstanding_amount {0} from `tabSales Invoice` where docstatus = 1 %s order by posting_date desc, name desc""".format(additional_query_columns or '') % @@ -206,6 +223,24 @@ def get_invoice_so_dn_map(invoice_list): return invoice_so_dn_map +def get_invoice_cc_wh_map(invoice_list): + si_items = frappe.db.sql("""select parent, cost_center, warehouse + from `tabSales Invoice Item` where parent in (%s) + and (ifnull(cost_center, '') != '' or ifnull(warehouse, '') != '')""" % + ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) + + invoice_cc_wh_map = {} + for d in si_items: + if d.cost_center: + invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault( + "cost_center", []).append(d.cost_center) + + if d.warehouse: + invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault( + "warehouse", []).append(d.warehouse) + + return invoice_cc_wh_map + def get_customer_details(customers): customer_map = {} for cust in frappe.db.sql("""select name, territory, customer_group from `tabCustomer` @@ -225,4 +260,4 @@ def get_mode_of_payments(invoice_list): for d in inv_mop: mode_of_payments.setdefault(d.parent, []).append(d.mode_of_payment) - return mode_of_payments + return mode_of_payments \ No newline at end of file From eb3982044ba9d40bf95234d598033bbc17d0cc9b Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 16 Nov 2017 14:11:39 +0530 Subject: [PATCH 110/164] convert html into text in the taxes description as it can break the reports (#11603) --- .../purchase_taxes_and_charges.json | 96 ++++++++++++++++++- .../sales_taxes_and_charges.json | 85 +++++++++++++++- .../item_wise_sales_register.py | 4 +- .../landed_cost_taxes_and_charges.json | 15 ++- 4 files changed, 189 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json index 47e6889cd4e..2b7fe776ec0 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "hash", @@ -10,8 +11,10 @@ "doctype": "DocType", "document_type": "Setup", "editable_grid": 1, + "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -23,7 +26,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Consider Tax or Charge for", "length": 0, "no_copy": 0, @@ -34,6 +39,7 @@ "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, @@ -41,6 +47,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -52,7 +59,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Add or Deduct", "length": 0, "no_copy": 0, @@ -63,6 +72,7 @@ "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, @@ -70,6 +80,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -80,7 +91,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Type", "length": 0, "no_copy": 0, @@ -91,6 +104,7 @@ "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, @@ -98,6 +112,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -109,7 +124,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Reference Row #", "length": 0, "no_copy": 0, @@ -119,6 +136,7 @@ "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, @@ -126,6 +144,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -137,7 +156,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Is this Tax included in Basic Rate?", "length": 0, "no_copy": 0, @@ -146,6 +167,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 1, "reqd": 0, "search_index": 0, @@ -153,6 +175,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -163,13 +186,16 @@ "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, "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, @@ -177,6 +203,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -187,7 +214,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Account Head", "length": 0, "no_copy": 0, @@ -198,6 +227,7 @@ "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, @@ -205,6 +235,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -216,7 +247,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Cost Center", "length": 0, "no_copy": 0, @@ -227,6 +260,7 @@ "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, @@ -234,17 +268,20 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, "fieldname": "description", - "fieldtype": "Text Editor", + "fieldtype": "Small Text", "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": "Description", "length": 0, "no_copy": 0, @@ -255,6 +292,7 @@ "print_hide_if_no_value": 0, "print_width": "300px", "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, "search_index": 0, @@ -263,6 +301,7 @@ "width": "300px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -273,7 +312,9 @@ "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, @@ -281,6 +322,7 @@ "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, @@ -288,6 +330,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -298,7 +341,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Rate", "length": 0, "no_copy": 0, @@ -308,6 +353,7 @@ "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, @@ -315,6 +361,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -325,7 +372,9 @@ "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, @@ -333,6 +382,7 @@ "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, @@ -340,6 +390,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -350,7 +401,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Amount", "length": 0, "no_copy": 0, @@ -361,6 +414,7 @@ "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, @@ -368,6 +422,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -378,7 +433,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Tax Amount After Discount Amount", "length": 0, "no_copy": 0, @@ -388,6 +445,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -395,6 +453,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -405,7 +464,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Total", "length": 0, "no_copy": 0, @@ -416,6 +477,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -423,6 +485,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -433,7 +496,9 @@ "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, @@ -441,6 +506,7 @@ "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, @@ -448,6 +514,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -458,7 +525,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Amount (Company Currency)", "length": 0, "no_copy": 0, @@ -468,6 +537,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -475,6 +545,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -485,7 +556,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Total (Company Currency)", "length": 0, "no_copy": 0, @@ -495,6 +568,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -502,6 +576,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -512,7 +587,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Tax Amount After Discount Amount", "length": 0, "no_copy": 0, @@ -522,6 +599,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -529,6 +607,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -539,7 +618,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Item Wise Tax Detail ", "length": 0, "no_copy": 0, @@ -549,6 +630,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -556,6 +638,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -565,8 +648,10 @@ "hidden": 1, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 1, + "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Parenttype", "length": 0, "no_copy": 0, @@ -576,6 +661,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -583,17 +669,17 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 1, "hide_toolbar": 0, "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-08-26 03:20:22.118330", + "modified": "2017-11-15 19:26:57.074345", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Taxes and Charges", @@ -602,5 +688,7 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, + "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json index 9f6c0036b5e..7e3ccc25e0c 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json +++ b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "INVTD.######", @@ -12,6 +13,7 @@ "editable_grid": 1, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -22,7 +24,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Type", "length": 0, "no_copy": 0, @@ -33,6 +37,7 @@ "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, @@ -40,6 +45,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -51,7 +57,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Reference Row #", "length": 0, "no_copy": 0, @@ -61,6 +69,7 @@ "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, @@ -68,6 +77,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -78,7 +88,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Account Head", "length": 0, "no_copy": 0, @@ -89,6 +101,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, "search_index": 1, @@ -96,6 +109,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -107,7 +121,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Cost Center", "length": 0, "no_copy": 0, @@ -118,6 +134,7 @@ "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, @@ -125,6 +142,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -135,13 +153,16 @@ "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, "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, @@ -150,17 +171,20 @@ "width": "50%" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, "fieldname": "description", - "fieldtype": "Text Editor", + "fieldtype": "Small Text", "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": "Description", "length": 0, "no_copy": 0, @@ -171,6 +195,7 @@ "print_hide_if_no_value": 0, "print_width": "300px", "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, "search_index": 0, @@ -179,6 +204,7 @@ "width": "300px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -190,7 +216,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Is this Tax included in Basic Rate?", "length": 0, "no_copy": 0, @@ -199,6 +227,7 @@ "print_hide_if_no_value": 0, "print_width": "150px", "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 1, "reqd": 0, "search_index": 0, @@ -207,6 +236,7 @@ "width": "150px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -217,7 +247,9 @@ "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, @@ -225,6 +257,7 @@ "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, @@ -232,6 +265,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -242,7 +276,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Rate", "length": 0, "no_copy": 0, @@ -252,6 +288,7 @@ "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, @@ -259,6 +296,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -269,7 +307,9 @@ "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, @@ -277,6 +317,7 @@ "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, @@ -284,6 +325,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -294,7 +336,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Amount", "length": 0, "no_copy": 0, @@ -304,6 +348,7 @@ "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, @@ -311,6 +356,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -321,7 +367,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Total", "length": 0, "no_copy": 0, @@ -331,6 +379,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -338,6 +387,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -348,7 +398,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Tax Amount After Discount Amount", "length": 0, "no_copy": 0, @@ -358,6 +410,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -365,6 +418,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -375,7 +429,9 @@ "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, @@ -383,6 +439,7 @@ "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, @@ -390,6 +447,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -400,7 +458,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Amount (Company Currency)", "length": 0, "no_copy": 0, @@ -411,6 +471,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -418,6 +479,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -428,7 +490,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Total (Company Currency)", "length": 0, "no_copy": 0, @@ -439,6 +503,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -446,6 +511,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -457,7 +523,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Tax Amount After Discount Amount (Company Currency)", "length": 0, "no_copy": 0, @@ -466,6 +534,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -473,6 +542,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -483,7 +553,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Item Wise Tax Detail", "length": 0, "no_copy": 0, @@ -493,6 +565,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -500,6 +573,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -510,7 +584,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 1, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Parenttype", "length": 0, "no_copy": 0, @@ -520,6 +596,7 @@ "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 1, @@ -527,17 +604,17 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 1, "hide_toolbar": 0, "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-08-26 03:08:03.235381", + "modified": "2017-11-15 19:24:39.351600", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Taxes and Charges", @@ -546,6 +623,8 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, "sort_order": "ASC", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py index 9892e03f3fe..205d43fde41 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py @@ -189,7 +189,9 @@ def get_tax_accounts(item_list, columns, company_currency, for parent, description, item_wise_tax_detail, charge_type, tax_amount in tax_details: if description not in tax_columns and tax_amount: - tax_columns.append(description) + # as description is text editor earlier and markup can break the column convention in reports + from frappe.utils.xlsxutils import handle_html + tax_columns.append(handle_html(description)) if item_wise_tax_detail: try: diff --git a/erpnext/stock/doctype/landed_cost_taxes_and_charges/landed_cost_taxes_and_charges.json b/erpnext/stock/doctype/landed_cost_taxes_and_charges/landed_cost_taxes_and_charges.json index dbc6a88ba3a..1aaf73f3ad1 100644 --- a/erpnext/stock/doctype/landed_cost_taxes_and_charges/landed_cost_taxes_and_charges.json +++ b/erpnext/stock/doctype/landed_cost_taxes_and_charges/landed_cost_taxes_and_charges.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "beta": 0, @@ -12,16 +13,18 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, "fieldname": "description", - "fieldtype": "Text Editor", + "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Description", @@ -39,6 +42,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -49,6 +53,7 @@ "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, @@ -66,6 +71,7 @@ "width": "50%" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -76,6 +82,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Amount", @@ -94,17 +101,17 @@ "unique": 0 } ], + "has_web_view": 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-20 05:44:54.700163", + "modified": "2017-11-15 19:27:59.542487", "modified_by": "Administrator", "module": "Stock", "name": "Landed Cost Taxes and Charges", @@ -114,7 +121,9 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file From f7e6934d7ca9683d1aa28166f58779d44a7c97a1 Mon Sep 17 00:00:00 2001 From: tundebabzy Date: Thu, 16 Nov 2017 09:43:49 +0100 Subject: [PATCH 111/164] handle None case in `update_reserved_qty_for_production` (#11593) --- erpnext/stock/doctype/bin/bin.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index 9b49b692095..626a9db97f3 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -88,10 +88,11 @@ class Bin(Document): and item.source_warehouse = %s and pro.status not in ("Stopped", "Completed")''', (self.item_code, self.warehouse))[0][0] - self.set_projected_qty() + if self.reserved_qty_for_production: + self.set_projected_qty() - self.db_set('reserved_qty_for_production', self.reserved_qty_for_production) - self.db_set('projected_qty', self.projected_qty) + self.db_set('reserved_qty_for_production', self.reserved_qty_for_production) + self.db_set('projected_qty', self.projected_qty) def update_item_projected_qty(item_code): From 135a54ca93165e919f613df9c800a3956cee13ba Mon Sep 17 00:00:00 2001 From: augustinfotech <33665477+augustinfotech@users.noreply.github.com> Date: Thu, 16 Nov 2017 15:28:42 +0530 Subject: [PATCH 112/164] Allow print before pay in POS (#11590) --- .../doctype/pos_profile/pos_profile.json | 30 +++++++++++++++++++ erpnext/accounts/page/pos/pos.js | 6 +++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.json b/erpnext/accounts/doctype/pos_profile/pos_profile.json index e2246bcd5d5..2740ef21125 100644 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.json +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -286,6 +286,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "allow_print_before_pay", + "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": "Allow Print Before Pay", + "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, diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index 6b580335262..558dd8dc1c6 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -1505,11 +1505,15 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ me.make_menu_list() }, "fa fa-plus") - if (this.frm.doc.docstatus == 1) { + if (this.frm.doc.docstatus == 1 || this.pos_profile_data["allow_print_before_pay"]) { this.page.set_secondary_action(__("Print"), function () { + me.create_invoice(); var html = frappe.render(me.print_template_data, me.frm.doc) me.print_document(html) }) + } + + if (this.frm.doc.docstatus == 1) { this.page.add_menu_item(__("Email"), function () { me.email_prompt() }) From 46be9896a99f591b745e6067559bf0811f88ab21 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 16 Nov 2017 16:51:55 +0530 Subject: [PATCH 113/164] Account number in chart of accounts (#10551) * Account number in chart of accounts * Include account number while renaming account * Test case fixed * Standard coa with and without numbers * Standard coa with and without numbers --- erpnext/accounts/doctype/account/account.js | 46 + erpnext/accounts/doctype/account/account.json | 34 +- erpnext/accounts/doctype/account/account.py | 79 +- .../accounts/doctype/account/account_tree.js | 2 + .../chart_of_accounts/chart_of_accounts.py | 55 +- .../unverified/ar_ar_chart_template.json | 209 -- .../ca_ca_en_chart_template_en.json | 172 -- .../hu_hungarian_chart_template.json | 355 --- .../unverified/nl_l10nnl_chart_template.json | 716 ------ .../verified/ar_chart_of_accounts.json | 1155 +++++++--- .../verified/fr_plan_comptable_general.json | 2 +- .../verified/gt_cuentas_plantilla.json | 710 +++--- .../verified/hu_chart_of_accounts.json | 21 +- .../verified/id_chart_of_accounts.json | 970 +++++--- .../in_standard_chart_of_accounts.json | 313 +-- ...d_chart_of_accounts_with_account_number.py | 275 +++ .../verified/tw_chart_of_accounts.json | 2028 +++++++++++------ .../accounts/doctype/account/test_account.py | 31 + .../account/{ => tests}/test_account.js | 0 .../account/tests/test_account_with_number.js | 69 + .../{ => tests}/test_make_tax_account.js | 0 .../manual/en/accounts/chart-of-accounts.md | 21 +- erpnext/setup/doctype/company/company.js | 1 + erpnext/setup/doctype/company/company.py | 2 +- .../setup/doctype/company/test_records.json | 6 +- erpnext/setup/utils.py | 4 +- .../delivery_note/test_delivery_note.py | 1 + 27 files changed, 3908 insertions(+), 3369 deletions(-) delete mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/unverified/ar_ar_chart_template.json delete mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/unverified/ca_ca_en_chart_template_en.json delete mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/unverified/hu_hungarian_chart_template.json delete mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/unverified/nl_l10nnl_chart_template.json create mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py rename erpnext/accounts/doctype/account/{ => tests}/test_account.js (100%) create mode 100644 erpnext/accounts/doctype/account/tests/test_account_with_number.js rename erpnext/accounts/doctype/account/{ => tests}/test_make_tax_account.js (100%) diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js index ca46d6b0e56..3a86fbcda9f 100644 --- a/erpnext/accounts/doctype/account/account.js +++ b/erpnext/accounts/doctype/account/account.js @@ -47,6 +47,12 @@ frappe.ui.form.on('Account', { // show / hide convert buttons frm.trigger('add_toolbar_buttons'); } + + if(!frm.doc.__islocal) { + frm.add_custom_button(__('Update Account Number'), function () { + frm.trigger("update_account_number"); + }); + } }, account_type: function (frm) { if (frm.doc.is_group == 0) { @@ -90,6 +96,46 @@ frappe.ui.form.on('Account', { }); }); } + }, + update_account_number: function(frm) { + var d = new frappe.ui.Dialog({ + title: __('Update Account Number'), + fields: [ + { + "label": "Account Number", + "fieldname": "account_number", + "fieldtype": "Data", + "reqd": 1 + } + ], + primary_action: function() { + var data = d.get_values(); + if(data.account_number === frm.doc.account_number) { + d.hide(); + return; + } + + frappe.call({ + method: "erpnext.accounts.doctype.account.account.update_account_number", + args: { + account_number: data.account_number, + name: frm.doc.name + }, + callback: function(r) { + if(!r.exc) { + if(r.message) { + frappe.set_route("Form", "Account", r.message); + } else { + frm.set_value("account_number", data.account_number); + } + d.hide(); + } + } + }); + }, + primary_action_label: __('Update') + }); + d.show(); } }); \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 8de923f2e00..8731c5108f6 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -102,6 +102,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "account_number", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Account Number", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -545,7 +575,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-11 15:28:35.855809", + "modified": "2017-08-22 17:39:10.711343", "modified_by": "Administrator", "module": "Accounts", "name": "Account", @@ -655,7 +685,7 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, - "search_fields": "", + "search_fields": "account_number", "show_name_in_global_search": 1, "sort_order": "ASC", "track_changes": 1, diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index b31c5d65290..ce4fb3f764a 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import cint, fmt_money +from frappe.utils import cint, cstr from frappe import throw, _ from frappe.model.document import Document @@ -20,18 +20,14 @@ class Account(Document): self.set_onload("can_freeze_account", True) def autoname(self): - # first validate if company exists - company = frappe.db.get_value("Company", self.company, ["abbr", "name"], as_dict=True) - if not company: - frappe.throw(_('Company {0} does not exist').format(self.company)) - - self.name = self.account_name.strip() + ' - ' + company.abbr + self.name = get_account_autoname(self.account_number, self.account_name, self.company) def validate(self): if frappe.local.flags.allow_unverified_charts: return self.validate_parent() self.validate_root_details() + validate_account_number(self.name, self.account_number, self.company) self.validate_group_or_ledger() self.set_root_and_report_type() self.validate_mandatory() @@ -56,12 +52,15 @@ class Account(Document): def set_root_and_report_type(self): if self.parent_account: - par = frappe.db.get_value("Account", self.parent_account, ["report_type", "root_type"], as_dict=1) + par = frappe.db.get_value("Account", self.parent_account, + ["report_type", "root_type", "account_type"], as_dict=1) if par.report_type: self.report_type = par.report_type if par.root_type: self.root_type = par.root_type + if par.account_type and not self.account_type: + self.account_type = par.account_type if self.is_group: db_value = frappe.db.get_value("Account", self.name, ["report_type", "root_type"], as_dict=1) @@ -186,6 +185,7 @@ class Account(Document): # Add company abbr if not provided from erpnext.setup.doctype.company.company import get_name_with_abbr new_account = get_name_with_abbr(new, self.company) + new_account = get_name_with_number(new_account, self.account_number) # Validate properties before merging if merge: @@ -208,7 +208,25 @@ class Account(Document): super(Account, self).after_rename(old, new, merge) if not merge: - frappe.db.set_value("Account", new, "account_name", " - ".join(new.split(" - ")[:-1])) + new_acc = frappe.db.get_value("Account", new, ["account_name", "account_number"], as_dict=1) + + # exclude company abbr + new_parts = new.split(" - ")[:-1] + # update account number and remove from parts + if new_parts[0][0].isdigit(): + # if account number is separate by space, split using space + if len(new_parts) == 1: + new_parts = new.split(" ") + if new_acc.account_number != new_parts[0]: + self.account_number = new_parts[0] + self.db_set("account_number", new_parts[0]) + new_parts = new_parts[1:] + + # update account name + account_name = " - ".join(new_parts) + if new_acc.account_name != account_name: + self.account_name = account_name + self.db_set("account_name", account_name) def get_parent_account(doctype, txt, searchfield, start, page_len, filters): return frappe.db.sql("""select name from tabAccount @@ -229,3 +247,46 @@ def get_account_currency(account): return account_currency return frappe.local_cache("account_currency", account, generator) + +def get_account_autoname(account_number, account_name, company): + # first validate if company exists + company = frappe.db.get_value("Company", company, ["abbr", "name"], as_dict=True) + if not company: + frappe.throw(_('Company {0} does not exist').format(company)) + + parts = [account_name.strip(), company.abbr] + if cstr(account_number).strip(): + parts.insert(0, cstr(account_number).strip()) + return ' - '.join(parts) + +def validate_account_number(name, account_number, company): + if account_number: + account_with_same_number = frappe.db.get_value("Account", + {"account_number": account_number, "company": company, "name": ["!=", name]}) + if account_with_same_number: + frappe.throw(_("Account Number {0} already used in account {1}") + .format(account_number, account_with_same_number)) + +@frappe.whitelist() +def update_account_number(name, account_number): + account = frappe.db.get_value("Account", name, ["account_name", "company"], as_dict=True) + + validate_account_number(name, account_number, account.company) + + frappe.db.set_value("Account", name, "account_number", account_number) + + account_name = account.account_name + if account_name[0].isdigit(): + separator = " - " if " - " in account_name else " " + account_name = account_name.split(separator, 1)[1] + frappe.db.set_value("Account", name, "account_name", account_name) + + new_name = get_account_autoname(account_number, account_name, account.company) + if name != new_name: + frappe.rename_doc("Account", name, new_name) + return new_name + +def get_name_with_number(new_account, account_number): + if account_number and not new_account[0].isdigit(): + new_account = account_number + " - " + new_account + return new_account \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js index 20d760670f5..2f4e09b53ce 100644 --- a/erpnext/accounts/doctype/account/account_tree.js +++ b/erpnext/accounts/doctype/account/account_tree.js @@ -24,6 +24,8 @@ frappe.treeview_settings["Account"] = { fields: [ {fieldtype:'Data', fieldname:'account_name', label:__('New Account Name'), reqd:true, description: __("Name of new Account. Note: Please don't create accounts for Customers and Suppliers")}, + {fieldtype:'Data', fieldname:'account_number', label:__('Account Number'), + description: __("Number of new Account, it will be included in the account name as a prefix")}, {fieldtype:'Check', fieldname:'is_group', label:__('Is Group'), description: __('Further accounts can be made under Groups, but entries can be made against non-Groups')}, {fieldtype:'Select', fieldname:'root_type', label:__('Root Type'), diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py index 1e694e7e3a7..dc98db141ee 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py +++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py @@ -16,12 +16,12 @@ def create_charts(company, chart_template=None, existing_company=None): if root_account: root_type = child.get("root_type") - if account_name not in ["account_type", "root_type", "is_group", "tax_rate"]: + if account_name not in ["account_number", "account_type", + "root_type", "is_group", "tax_rate"]: - account_name_in_db = unidecode(account_name.strip().lower()) - if account_name_in_db in accounts: - count = accounts.count(account_name_in_db) - account_name = account_name + " " + cstr(count) + account_number = cstr(child.get("account_number")).strip() + account_name, account_name_in_db = add_suffix_if_duplicate(account_name, + account_number, accounts) is_group = identify_is_group(child) report_type = "Balance Sheet" if root_type in ["Asset", "Liability", "Equity"] \ @@ -35,6 +35,7 @@ def create_charts(company, chart_template=None, existing_company=None): "is_group": is_group, "root_type": root_type, "report_type": report_type, + "account_number": account_number, "account_type": child.get("account_type"), "account_currency": frappe.db.get_value("Company", company, "default_currency"), "tax_rate": child.get("tax_rate") @@ -53,10 +54,23 @@ def create_charts(company, chart_template=None, existing_company=None): _import_accounts(chart, None, None, root_account=True) +def add_suffix_if_duplicate(account_name, account_number, accounts): + if account_number: + account_name_in_db = unidecode(" - ".join([account_number, + account_name.strip().lower()])) + else: + account_name_in_db = unidecode(account_name.strip().lower()) + + if account_name_in_db in accounts: + count = accounts.count(account_name_in_db) + account_name = account_name + " " + cstr(count) + + return account_name, account_name_in_db + def identify_is_group(child): if child.get("is_group"): is_group = child.get("is_group") - elif len(set(child.keys()) - set(["account_type", "root_type", "is_group", "tax_rate"])): + elif len(set(child.keys()) - set(["account_type", "root_type", "is_group", "tax_rate", "account_number"])): is_group = 1 else: is_group = 0 @@ -71,6 +85,10 @@ def get_chart(chart_template, existing_company=None): elif chart_template == "Standard": from erpnext.accounts.doctype.account.chart_of_accounts.verified import standard_chart_of_accounts return standard_chart_of_accounts.get() + elif chart_template == "Standard with Numbers": + from erpnext.accounts.doctype.account.chart_of_accounts.verified \ + import standard_chart_of_accounts_with_account_number + return standard_chart_of_accounts_with_account_number.get() else: folders = ("verified",) if frappe.local.flags.allow_unverified_charts: @@ -86,7 +104,7 @@ def get_chart(chart_template, existing_company=None): return json.loads(chart).get("tree") @frappe.whitelist() -def get_charts_for_country(country): +def get_charts_for_country(country, with_standard=False): charts = [] def _get_chart_name(content): @@ -111,26 +129,26 @@ def get_charts_for_country(country): with open(os.path.join(path, fname), "r") as f: _get_chart_name(f.read()) - if len(charts) != 1: - charts.append("Standard") + if len(charts) != 1 or with_standard: + charts += ["Standard", "Standard with Numbers"] return charts def get_account_tree_from_existing_company(existing_company): - all_accounts = frappe.get_all('Account', - filters={'company': existing_company}, - fields = ["name", "account_name", "parent_account", "account_type", - "is_group", "root_type", "tax_rate"], + all_accounts = frappe.get_all('Account', + filters={'company': existing_company}, + fields = ["name", "account_name", "parent_account", "account_type", + "is_group", "root_type", "tax_rate", "account_number"], order_by="lft, rgt") - + account_tree = {} # fill in tree starting with root accounts (those with no parent) if all_accounts: build_account_tree(account_tree, None, all_accounts) return account_tree - + def build_account_tree(tree, parent, all_accounts): # find children parent_account = parent.name if parent else "" @@ -139,17 +157,16 @@ def build_account_tree(tree, parent, all_accounts): # if no children, but a group account if not children and parent.is_group: tree["is_group"] = 1 + tree["account_number"] = parent.account_number # build a subtree for each child for child in children: - if child.account_type == "Stock" and not child.is_group: - tree["is_group"] = 1 - continue - # start new subtree tree[child.account_name] = {} # assign account_type and root_type + if child.account_type: + tree[child.account_name]["account_number"] = child.account_number if child.account_type: tree[child.account_name]["account_type"] = child.account_type if child.tax_rate: diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/ar_ar_chart_template.json b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/ar_ar_chart_template.json deleted file mode 100644 index 0dfd1bdb440..00000000000 --- a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/ar_ar_chart_template.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "country_code": "ar", - "name": "Argentina - Plan de Cuentas", - "tree": { - "Cuentas Patrimoniales": { - "ACTIVO": { - "Bienes Inmateriales": { - "Bienes Inmateriales / (-) Amortizaci\u00f3n Acumulada": {}, - "Bienes Inmateriales / Concesiones y Franquicias": {}, - "Bienes Inmateriales / Marcas de F\u00e1brica": {}, - "Bienes Inmateriales / Patentes de Invenci\u00f3n": {} - }, - "Bienes de Cambio": { - "(-) Previsi\u00f3n para Desvalorizaci\u00f3n de Bienes de Cambio": {}, - "Bienes de Cambio - Mercader\u00edas": { - "Bienes de Cambio - Mercader\u00edas / Categoria de productos 01": {} - }, - "Bienes de Cambio - Mercader\u00edas en Tr\u00e1nsito": {}, - "Materiales Varios ": {}, - "Materias primas": {}, - "Productos Elaborados": {}, - "Productos en Curso de Elaboraci\u00f3n": {} - }, - "Bienes de Uso": { - "Bienes de Uso / (-) Depreciaci\u00f3n Acumulada": {}, - "Bienes de Uso / Equipos": {}, - "Bienes de Uso / Inmuebles": {}, - "Bienes de Uso / Maquinaria": {}, - "Bienes de Uso / Rodados": {} - }, - "Caja y Bancos": { - "Caja y Bancos - Caja": { - "Caja y bancos - Caja / efectivo ARS": {} - }, - "Caja y Bancos - Cuentas Corrientes": { - "Caja y Bancos.../ BCO. CTA CTE ARS": {} - }, - "Caja y Bancos - Fondos fijos": { - "Caja y ...- Fondos fijos / caja chica 01 ARS": {} - }, - "Caja y Bancos - Moneda Extranjera": { - "Caja y bancos - Caja / efectivo USD": {} - }, - "Caja y bancos - Recaudaciones a Depositar ": {}, - "Caja y bancos - Valores a Depositar ": {} - }, - "Inversiones": { - "Inversiones / (-) Previsi\u00f3n para Devalorizaci\u00f3n de Acciones": {}, - "Inversiones / Acciones Permanentes": {}, - "Inversiones / Acciones Transitorias": {}, - "Inversiones / T\u00edtulos P\u00fablicos": {} - } - }, - "Cr\u00e9ditos por Ventas": { - "Cr\u00e9ditos por Ventas / (-) Previsi\u00f3n para Ds. Incobrables": {}, - "Cr\u00e9ditos por Ventas / Deudores Morosos": {}, - "Cr\u00e9ditos por Ventas / Deudores Varios": {}, - "Cr\u00e9ditos por Ventas / Deudores en Gesti\u00f3n Judicial": {}, - "Cr\u00e9ditos por Ventas / Deudores por Ventas": {} - }, - "Otros Cr\u00e9ditos": { - "Otros Cr\u00e9ditos / (-) Intereses (+) a Devengar": {}, - "Otros Cr\u00e9ditos / (-) Previsi\u00f3n para Descuentos": {}, - "Otros Cr\u00e9ditos / Accionistas": {}, - "Otros Cr\u00e9ditos / Alquileres Pagados por Adelantado": {}, - "Otros Cr\u00e9ditos / Anticipo al Personal": {}, - "Otros Cr\u00e9ditos / Anticipo de Impuestos": {}, - "Otros Cr\u00e9ditos / Anticipos a Proveedores": {}, - "Otros Cr\u00e9ditos / Intereses Pagados por Adelantado": {}, - "Otros Cr\u00e9ditos / Pr\u00e9stamos otorgados": {} - }, - "PASIVO": { - "Deudas Bancarias y Financieras": { - "Deudas Bancarias y Financieras / Adelantos en Cuenta Corriente": {}, - "Deudas Bancarias y Financieras / Debentures Emitidos": {}, - "Deudas Bancarias y Financieras / Intereses a Pagar": {}, - "Deudas Bancarias y Financieras / Obligaciones a Pagar": {}, - "Deudas Bancarias y Financieras / Prestamos": {} - }, - "Deudas Comerciales": { - "Deudas Comerciales / (-) Intereses a Devengar por Compras al Cr\u00e9dito": {}, - "Deudas Comerciales / Anticipos de Clientes": {}, - "Deudas Comerciales / Proveedores": {} - }, - "Deudas Fiscales": { - "Deudas Fiscales / IVA a Pagar": {}, - "Deudas Fiscales / Impuesto a la Ganancia M\u00ednima Presunta a Pagar": {}, - "Deudas Fiscales / Impuesto a las Ganancias a Pagar": {}, - "Deudas Fiscales / Impuesto a los D\u00e9bitos y Cr\u00e9ditos Bancarios a Pagar": {}, - "Deudas Fiscales / Impuesto sobre los Bienes Personales a Pagar": {}, - "Deudas Fiscales / Monotributo a Pagar": {} - }, - "Deudas Sociales": { - "Deudas Sociales / Cargas Sociales a Pagar": {}, - "Deudas Sociales / Provisi\u00f3n para Sueldo Anual Complementario": {}, - "Deudas Sociales / Retenciones a Depositar": {}, - "Deudas Sociales / Sueldos a Pagar": {} - }, - "Otras Deudas": { - "Otras Deudas / Acreedores Varios": {}, - "Otras Deudas / Cobros por Adelantado": {}, - "Otras Deudas / Dividendos a Pagar": {}, - "Otras Deudas / Honorarios Directores y S\u00edndicos a Pagar": {} - }, - "Previsiones": { - "Previsiones / Previsi\u00f3n Indemnizaci\u00f3n por Despidos": {}, - "Previsiones / Previsi\u00f3n para Garant\u00edas por Service": {}, - "Previsiones / Previsi\u00f3n para juicios Pendientes": {} - } - }, - "PATRIMONIO NETO": { - "Ajustes al Patrimonio": { - "Ajustes al Patrimonio / Revaluo T\u00e9cnico de Bienes de Uso": {} - }, - "Aportes No Capitalizados": { - "Aportes No Capitalizados / Aportes Irrevocables Futura Suscripci\u00f3n de Acciones": {}, - "Aportes No Capitalizados / Primas de Emsi\u00f3n": {} - }, - "Capital Social": { - "Capital social / (-) Descuento de Emisi\u00f3n de Acciones": {}, - "Capital social / Acciones en Circulaci\u00f3n": {}, - "Capital social / Capital Suscripto": {}, - "Capital social / Dividendos a Distribuir en Acciones": {} - }, - "Ganancias Reservadas": { - "Reserva Estatutaria": {}, - "Reserva Facultativa": {}, - "Reserva Legal": {}, - "Reserva para Renovaci\u00f3n de Bienes de Uso": {} - }, - "Resultados No Asignados": { - "Ganancias y P\u00e9rdidas del Ejercicio": {}, - "Resultado del Ejercicio": {}, - "Resultados Acumulados": {}, - "Resultados Acumulados del Ejercicio Anterior": {} - } - }, - "root_type": "" - }, - "Cuentas de Movimiento": { - "Compras": { - "Compras - Categoria de productos 01": {} - }, - "Costos de Producci\u00f3n": {}, - "Gastos de Administraci\u00f3n": {}, - "Gastos de Comercializaci\u00f3n": {}, - "root_type": "" - }, - "Cuentas de Orden": { - "CUENTAS DE ORDEN ACREEDORAS": { - "Acreedor por Documentos Descontados": {}, - "Acreedor por Garant\u00edas Otorgadas": {}, - "Comitente por Mercaderias Recibidas en Consignaci\u00f3n": {} - }, - "CUENTAS DE ORDEN DEUDORAS": { - "Dep\u00f3sito de Valores Recibos en Garant\u00eda": {}, - "Documentos Descontados": {}, - "Documentos Endosados": {}, - "Garantias Otorgadas": {}, - "Mercaderias Recibidas en Consignaci\u00f3n": {} - }, - "root_type": "" - }, - "Cuentas de Resultado": { - "RESULTADOS NEGATIVOS": { - "Resultados Negativos Extraordinarios": { - "Donaciones Cedidas, Otorgadas": {}, - "Gastos en Siniestros": {}, - "P\u00e9rdida Venta Bienes de Uso": {} - }, - "Resultados Negativos Ordinarios": { - "Costo de Mercader\u00edas Vendidas": { - "Costo de Mercader\u00edas Vendidas - Categoria de productos 01": {} - }, - "Gastos Bancarios": {}, - "Gastos de Publicidad y Propaganda": {}, - "Gastos en Amortizaci\u00f3n": {}, - "Gastos en Cargas Sociales": {}, - "Gastos en Depreciaci\u00f3n de Bienes de Uso": {}, - "Gastos en Impuestos": {}, - "Gastos en Servicios P\u00fablicos": {}, - "Gastos en Sueldos y Jormales": {} - } - }, - "RESULTADOS POSITIVOS": { - "Resultados Positivos Extraordinarios": { - "Donaciones obtenidas, ganandas, percibidas": {}, - "Ganancia Venta Inversiones Permanentes": {}, - "Ganancia Venta de Bienes de Uso": {}, - "Recupero de Deudores Incobrables": {}, - "Recupero de Rezagos": {} - }, - "Resultados Positivos Ordinarios": { - "Alquileres gananados, obtenidos, percibidos": {}, - "Comisiones gananados, obtenidos, percibidos": {}, - "Descuentos gananados, obtenidos, percibidos": {}, - "Ganancia Venta de Acciones": {}, - "Honorarios gananados, obtenidos, percibidos": {}, - "Intereses gananados, obtenidos, percibidos": {}, - "Renta de T\u00edtulos P\u00fablicos": {}, - "Resultados Positivos Ordinarios": { - "Ventas - Categoria de productos 01": {} - } - } - }, - "root_type": "" - } - } -} diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/ca_ca_en_chart_template_en.json b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/ca_ca_en_chart_template_en.json deleted file mode 100644 index 02c460981b0..00000000000 --- a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/ca_ca_en_chart_template_en.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "country_code": "ca", - "name": "Canada - Chart of Accounts for english-speaking provinces", - "tree": { - "ASSETS": { - "CURRENT ASSETS": { - "ACCOUNTS RECEIVABLES": { - "ALLOWANCE FOR DOUBTFUL ACCOUNTS": {}, - "Customers Account": { - "account_type": "Receivable" - } - }, - "CASH": {}, - "CERTIFICATES OF DEPOSITS": {}, - "INVESTMENTS HELD FOR TRADING": {}, - "PREPAID EXPENSES": {}, - "STOCKS": { - "Stock Delivered But Not Billed": {}, - "Stock In Hand": {} - }, - "TAXES RECEIVABLES": { - "GST receivable": { - "account_type": "Receivable" - }, - "HST receivable": { - "HST receivable - 13%": { - "account_type": "Receivable" - }, - "HST receivable - 14%": { - "account_type": "Receivable" - }, - "HST receivable - 15%": { - "account_type": "Receivable" - } - }, - "PST/QST receivable": { - "account_type": "Receivable" - } - }, - "TREASURY OR TREASURY EQUIVALENTS": {} - }, - "NON-CURRENT ASSETS": { - "INTANGIBLE ASSETS": { - "PATENTS, TRADEMARKS AND COPYRIGHTS": {} - }, - "INVESTMENTS AVAILABLE FOR SALE": {}, - "TANGIBLE ASSETS": { - "ACCUMULATED DEPRECIATIONS": {} - } - }, - "root_type": "Asset" - }, - "EQUITY": { - "CONTRIBUTED SURPLUS": {}, - "DIVIDENDS": {}, - "PREMIUMS": {}, - "RETAINED EARNINGS": {}, - "SHARE CAPITAL": {}, - "TRANSLATION ADJUSTMENTS": {}, - "root_type": "Equity" - }, - "EXPENSES": { - "NON-OPERATING EXPENSES": { - "INTERESTS EXPENSES": {}, - "OTHER NON-OPERATING EXPENSES": {} - }, - "OPERATING EXPENSES": { - "COST OF GOODS SOLD": { - "Inside Purchases": {}, - "International Purchases": {}, - "Purchases in harmonized provinces": {}, - "Purchases in non-harmonized provinces": {} - }, - "GENERAL EXPENSES": {}, - "LABOUR EXPENSES": { - "Annuities": {}, - "Employment Insurance": {}, - "Federal Income Tax": {}, - "Health Services Fund": {}, - "Holidays": {}, - "Labour Health and Safety": {}, - "Labour Standards": {}, - "Parental Insurance": {}, - "Provincial Income Tax": {}, - "Salaries, wages and commissions": {} - }, - "OTHER OPERATING EXPENSES": {}, - "RESEARCH AND DEVELOPMENT EXPENSES": {}, - "SALES EXPENSES": {} - }, - "root_type": "Expense" - }, - "INCOMES": { - "NON-OPERATING INCOMES": { - "INTERESTS": {}, - "OTHER NON-OPERATING INCOMES": {} - }, - "OPERATING INCOMES": { - "Harmonized Provinces Sales": {}, - "Inside Sales": {}, - "International Sales": {}, - "Non-Harmonized Provinces Sales": {}, - "OTHER OPERATING INCOMES": {} - }, - "root_type": "Income" - }, - "LIABILITIES": { - "CURRENT LIABILITIES": { - "ACCOUNTS PAYABLES": { - "Suppliers Account": { - "account_type": "Payable" - } - }, - "CURRENT FINANCIAL DEBTS": {}, - "LABOUR TAXES TO PAY": { - "CANADIAN REVENU AGENCY": { - "EMPLOYMENT INSURANCE TO PAY": { - "EI - Employees Contribution": {}, - "EI - Employer Contribution": {} - }, - "Federal Income Tax": {} - }, - "PROVINCIAL REVENU AGENCY": { - "ANNUITIES TO PAY": { - "Annuities - Employees Contribution": {}, - "Annuities - Employer Contribution": {} - }, - "Health Services Fund to pay": {}, - "Labour Health and Safety to pay": {}, - "Labour Standards to pay": {}, - "PARENTAL INSURANCE PLAN TO PAY": { - "PAP - Employee Contribution": {}, - "PAP - Employer Contribution": {} - }, - "Provincial Income Tax": {} - } - }, - "LIABILITIES ASSETS HELD FOR TRANSFER": { - "Stock Received But Not Billed": {} - }, - "OTHER ACCOUNTS PAYABLES": {}, - "STOCK LIABILITIES": {}, - "TAXES PAYABLES": { - "GST to pay": { - "account_type": "Payable" - }, - "HST to pay": { - "HST to pay - 13%": { - "account_type": "Payable" - }, - "HST to pay - 14%": { - "account_type": "Payable" - }, - "HST to pay - 15%": { - "account_type": "Payable" - } - }, - "PST/QST to pay": { - "account_type": "Payable" - } - } - }, - "NON-CURRENT LIABILITIES": { - "DEFERRED TAXES": {}, - "NON-CURRENT FINANCIAL DEBTS": {}, - "OTHER NON-CURRENT LIABILITIES": {}, - "PROVISIONS FOR PENSIONS AND OTHER POST-EMPLOYMENT ADVANTAGES": {} - }, - "root_type": "Liability" - } - } -} diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/hu_hungarian_chart_template.json b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/hu_hungarian_chart_template.json deleted file mode 100644 index 85a49c5702c..00000000000 --- a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/hu_hungarian_chart_template.json +++ /dev/null @@ -1,355 +0,0 @@ -{ - "country_code": "hu", - "name": "Hungary - Magyar f\u0151k\u00f6nyvi kivonat", - "tree": { - "Eredm\u00e9ny sz\u00e1ml\u00e1k": { - "AZ \u00c9RT\u00c9KES\u00cdT\u00c9S \u00c1RBEV\u00c9TELE, BEV\u00c9TELEK": { - "BELF\u00d6LDI \u00c9RK\u00c9KES\u00cdT\u00c9S \u00c1RBEV\u00c9TELE": { - "Belf\u00f6ldi \u00e9rt\u00e9kes\u00edt\u00e9s \u00e1rbev\u00e9tele": {} - }, - "BELF\u00d6LDI \u00c9RT\u00c9KES\u00cdT\u00c9S \u00c1RBEV\u00c9TELE": { - "Belf\u00f6ldi \u00e9rt\u00e9kes\u00edt\u00e9s \u00e1rbev\u00e9tele": {} - }, - "EGY\u00c9B BEV\u00c9TELEK": { - "Az \u00fczleti \u00e9vhez kapcs. egy\u00e9b bev\u00e9telek": {}, - "Biztos\u00edt\u00f3 \u00e1ltal visszaig. k\u00e1rt\u00e9r\u00edt\u00e9s \u00f6.": {}, - "C\u00e9ltartal\u00e9k felhaszn\u00e1l\u00e1sa": {}, - "K\u00fcl\u00f6nf\u00e9le egy\u00e9b bev\u00e9telek": {}, - "Ut\u00f3lag kapott p\u00fc. rendezett engedm\u00e9ny": {}, - "Visszafiz. k\u00f6t. n\u00e9lk\u00fcl kapott t\u00e1mogat\u00e1s": {}, - "\u00c9rt,\u00e1truh\u00e1zott k\u00f6vetel\u00e9sek elism.m\u00e9rt\u00e9ke": {}, - "\u00c9rt.immat. javak, t\u00e1rgyi eszk.bev\u00e9tele": {}, - "\u00c9rt\u00e9kveszt\u00e9sek vissza\u00edr\u00e1sa, tervenf.\u00e9cs.": {} - }, - "EXPORT \u00c9RT\u00c9KES\u00cdT\u00c9S \u00c1RBEV\u00c9TELE": { - "Export \u00e9rt\u00e9kes\u00edt\u00e9s \u00e1rbev. EU tagorsz\u00e1gba": {}, - "Export \u00e9rt\u00e9kes\u00edt\u00e9s \u00e1rbev.nem EU tagorsz.": {} - }, - "P\u00c9NZ\u00dcGYI M\u00dcVELETEK BEV\u00c9TELEI": { - "Befekt. p\u00fci.eszk. kamatai, \u00e1rf.nyeres.": {}, - "Egy\u00e9b kapott kamatok,kamatjell.bev\u00e9telek": {}, - "Egy\u00e9b p\u00e9nz\u00fcgyi m\u00fbveletek bev\u00e9telei": {}, - "Egy\u00e9b \u00e1rfolyamnyeres\u00e9gek, opci\u00f3s bev.": {}, - "Forg\u00f3eszk. \u00e9rt\u00e9kpap\u00edr \u00e1rfolyamnyeres\u00e9ge": {}, - "Kapott (j\u00e1r\u00f3) osztal\u00e9k, r\u00e9szesed\u00e9s": {}, - "R\u00e9szesed\u00e9sek \u00e9rt. \u00e1rfolyamnyeres\u00e9ge": {}, - "V\u00e1s. k\u00f6vetel\u00e9sekkel kapcs. bev\u00e9telek": {}, - "\u00c1tv\u00e1lt\u00e1si, \u00e1t\u00e9rt\u00e9kel\u00e9skori \u00e1rf.nyeres\u00e9g": {} - }, - "RENDKIV\u00dcLI BEV\u00c9TELEK": { - "Rendk\u00edv\u00fcli bev\u00e9telek": {} - } - }, - "AZ \u00c9RT\u00c9KES\u00cdT\u00c9S \u00d6NK\u00d6LTS. \u00c9S R\u00c1FORD\u00cdT\u00c1SOK": { - "ANYAGJELLEG\u00db R\u00c1FORD\u00cdT\u00c1SOK": { - "Anyagk\u00f6lts\u00e9g": {}, - "Egy\u00e9b szolg\u00e1ltat\u00e1sok \u00e9rt\u00e9ke": {}, - "Eladott (k\u00f6zvet\u00edtett) szolg. \u00e9rt\u00e9ke": {}, - "Eladott \u00e1ruk beszerz\u00e9si \u00e9rt\u00e9ke": {}, - "Ig\u00e9nybevett szolg\u00e1ltat\u00e1sok \u00e9rt\u00e9ke": {} - }, - "EGY\u00c9B R\u00c1FORD\u00cdT\u00c1SOK": { - "Ad\u00f3k, illet\u00e9kek, hozz\u00e1j\u00e1rul\u00e1sok": {}, - "Az \u00fczleti \u00e9vhez kapcs. r\u00e1ford\u00edt\u00e1sok": {}, - "C\u00e9ltartal\u00e9k k\u00e9pz\u00e9se": {}, - "Elsz\u00e1molt \u00e9rt\u00e9kveszt\u00e9s, tervenf. \u00e9rt\u00e9kcs": {}, - "K\u00fcl\u00f6nf\u00e9le egy\u00e9b r\u00e1ford\u00edt\u00e1sok": {}, - "Ut\u00f3lag adott p\u00fc. rendezett engedm\u00e9ny": {}, - "\u00c9rt.\u00e1truh\u00e1zott k\u00f6vetel\u00e9sek k\u00f6nyvsz. \u00e9rt.": {}, - "\u00c9rt\u00e9kes\u00edtett eszk.imm.javak nytsz \u00e9rt\u00e9ke": {} - }, - "NYERES\u00c9GET TERHEL\u00d6 AD\u00d3K": { - "Egyszer\u00fcs\u00edtett v\u00e1llalkoz\u00f3i ad\u00f3": {}, - "T\u00e1rsas v\u00e1llalkoz\u00e1s k\u00fcl\u00f6nad\u00f3ja": {}, - "T\u00e1rsas\u00e1gi ad\u00f3": {} - }, - "P\u00c9NZ\u00dcGYI M\u00dcVELETEK R\u00c1FORD\u00cdT\u00c1SAI": { - "Befektetett p\u00fci. eszk. \u00e1rf.vesztes\u00e9ge": {}, - "Egy\u00e9b p\u00e9nz\u00fcgyi r\u00e1ford\u00edt\u00e1sok": {}, - "Egy\u00e9b \u00e1rfolyamvesztes\u00e9gek, opci\u00f3s d\u00edjak": {}, - "Fizetend\u00f5 kamatok, kamatjell. r\u00e1ford.": {}, - "Forg\u00f3eszk. \u00e9rt\u00e9kpap\u00edr \u00e1rf.vesztes\u00e9ge": {}, - "R\u00e9szesed\u00e9sek,\u00e9.pap\u00edrok,bankb. \u00e9rt\u00e9kveszt": {}, - "V\u00e1s\u00e1rolt k\u00f6v. kapcs. r\u00e1ford\u00edt\u00e1sok": {}, - "\u00c1tv\u00e1lt\u00e1si, \u00e9rt\u00e9kel\u00e9si \u00e1rfolyamvesztes\u00e9g": {} - }, - "RENDKIV\u00dcLI R\u00c1FORD\u00cdT\u00c1SOK": { - "Egy\u00e9b vagyoncs\u00f6kk. rendk\u00edv\u00fcli r\u00e1ford\u00edt\u00e1s": {}, - "Saj\u00e1t \u00fczletr\u00e9sz nyilv\u00e1ntart\u00e1si \u00e9rt\u00e9ke": {}, - "Tartoz\u00e1s\u00e1tv. szerz. szerinti \u00f6sszege": {}, - "T\u00e1rsas\u00e1gban bevitt eszk. nytsz. \u00e9rt\u00e9ke": {} - }, - "SZEM\u00c9LYI JELLEG\u00fb R\u00c1FORD\u00cdT\u00c1SOK": { - "B\u00e9rj\u00e1rul\u00e9kok": {}, - "B\u00e9rk\u00f6lts\u00e9g": {}, - "Szem\u00e9lyi jelleg\u00fc egy\u00e9b kifizet\u00e9sek": {} - }, - "\u00c9RT\u00c9KCS\u00d6KKEN\u00c9SI LE\u00cdR\u00c1S": {} - }, - "K\u00d6LTS\u00c9GNEMEK": { - "AKT\u00cdV\u00c1LT SAJ\u00c1T TELJES\u00cdTM\u00c9NYEK \u00c9RT\u00c9KE": { - "Saj\u00e1t el\u00f5\u00e1ll\u00edt\u00e1si eszk\u00f6z\u00f6k aktiv\u00e1lt \u00e9rt.": {}, - "Saj\u00e1t term. k\u00e9szletek \u00e1llom\u00e1nyv\u00e1ltoz\u00e1sa": {} - }, - "ANYAGK\u00d6LTS\u00c9G": { - "Anyagk\u00f6lts\u00e9g megt\u00e9r\u00fcl\u00e9s": {}, - "Egy \u00e9ven bel\u00fcl elhaszn. anyagi eszk\u00f6z\u00f6k": {}, - "Egy\u00e9b anyagk\u00f6lts\u00e9g": {}, - "V\u00e1s\u00e1rolt anyagok k\u00f6lts\u00e9gei": {} - }, - "B\u00c9RJ\u00c1RUL\u00c9KOK": { - "Egyszer\u00fbs\u00edtett fogl. k\u00f6zteher": {}, - "Egyszer\u00fbs\u00edtett k\u00f6ztehervisel\u00e9si hj\u00e1r": {}, - "Eg\u00e9szs\u00e9g\u00fcgyi hozz\u00e1j\u00e1rul\u00e1s": {}, - "K\u00f6zteherjegy": {}, - "Munkaad\u00f3i j\u00e1rul\u00e9k": {}, - "Rehabilit\u00e1ci\u00f3s hozz\u00e1j\u00e1rul\u00e1s": {}, - "Szakk\u00e9pz\u00e9si hozz\u00e1j\u00e1rul\u00e1s": {}, - "T\u00e1rsadalombiztos\u00edt\u00e1si j\u00e1rul\u00e9k": {} - }, - "B\u00c9RK\u00d6LTS\u00c9G": { - "Egyszer\u00fbs\u00edtett fogl. b\u00e9rk\u00f6lts\u00e9ge": {}, - "Megb\u00edz\u00e1si d\u00edjak b\u00e9rk\u00f6lts\u00e9g terh\u00e9re": {}, - "Munkav\u00e1llal\u00f3k munkab\u00e9r k\u00f6lts\u00e9ge": {}, - "Tagok szem\u00e9lyes k\u00f6zr. ellen\u00e9rt\u00e9ke": {} - }, - "EGY\u00c9B SZOLG\u00c1LTAT\u00c1SOK K\u00d6LTS\u00c9GEI": { - "Biztos\u00edt\u00e1si d\u00edjak": {}, - "Hat\u00f3s\u00e1gi igazgat\u00e1si d\u00edjak (illet\u00e9kek)": {}, - "P\u00e9nz\u00fcgyi szolg-i d\u00edjak, bankk\u00f6lts\u00e9gek": {} - }, - "IG\u00c9NYBE VETT SZOLG\u00c1LTAT\u00c1SOK K\u00d6LTS\u00c9GEI": { - "B\u00e9rleti d\u00edjak": {}, - "Egy\u00e9b ig\u00e9nybevett szolg\u00e1ltat\u00e1sok ktg-ei": {}, - "Hirdet\u00e9s, rekl\u00e1m-propaganda k\u00f6lts\u00e9g": {}, - "Jav\u00edt\u00e1si, karbantart\u00e1si k\u00f6lts\u00e9gek": {}, - "Oktat\u00e1si, tov\u00e1bbk\u00e9pz\u00e9si k\u00f6lts\u00e9gek": {}, - "Postai, t\u00e1vk\u00f6zl\u00e9si k\u00f6lts\u00e9gek": {}, - "Szakk\u00f6nyv, foly\u00f3irat, napilap beszerz\u00e9s": {}, - "Sz\u00e1ll\u00edt\u00e1si, rakod\u00e1si k\u00f6lts\u00e9g": {}, - "Utaz\u00e1si- \u00e9s kik\u00fcldet\u00e9si k\u00f6lts\u00e9gek": {} - }, - "K\u00d6LTS\u00c9GNEM \u00c1TVEZET\u00c9SI SZ\u00c1MLA": { - "Anyagk\u00f6lts\u00e9g \u00e1tvezet\u00e9si szla": {}, - "B\u00e9rj\u00e1rul\u00e9kok \u00e1tvezet\u00e9si szla": {}, - "B\u00e9rk\u00f6lts\u00e9g \u00e1tvezet\u00e9si szla": {}, - "Egy\u00e9b szolg\u00e1ltat\u00e1sok \u00e1tvezet\u00e9si szla": {}, - "Ig\u00e9nybevett szolg. \u00e1tvezet\u00e9si szla": {}, - "Szem\u00e9lyi jell. kif. \u00e1tvezet\u00e9si szla": {}, - "\u00c9rt\u00e9kcs\u00f6kken\u00e9si le\u00edr\u00e1s \u00e1tvez. szla": {} - }, - "SZEM\u00c9LYI JELLEG\u00fb EGY\u00c9B KIFIZET\u00c9SEK": { - "Egy\u00e9b szem\u00e9lyi jelleg\u00fb kifizet\u00e9sek": {}, - "Foglalkoztat\u00f3t terhel\u00f5 t\u00e1pp\u00e9nz hj\u00e1rul\u00e1s": {}, - "J\u00f3l\u00e9ti \u00e9s kultur\u00e1lis k\u00f6lts\u00e9gek": {}, - "Kifizet\u00f5t terhel\u00f5 szem\u00e9lyi j\u00f6vedelemad\u00f3": {}, - "Mag\u00e1nnyugd\u00edjp\u00e9nzt\u00e1ri tagd\u00edjak, hozz\u00e1j\u00e1r.": {}, - "Szem\u00e9lyi jelleg\u00fb kifizet\u00e9sek": {}, - "Term\u00e9szetbeni juttat\u00e1sok": {} - }, - "\u00c9RT\u00c9KCS\u00d6KKEN\u00c9SI LE\u00cdR\u00c1S": { - "Terv szerinti egy\u00f6sszeg\u00fb (kis\u00e9rt\u00e9k\u00fbek)": {}, - "Terv szerinti \u00e9rt\u00e9kcs\u00f6kken\u00e9s line\u00e1ris": {} - } - }, - "root_type": "" - }, - "M\u00e9rleg sz\u00e1ml\u00e1k": { - "BEFEKTETETT ESZK\u00d6Z\u00d6K": { - "BEFEKTETETT P\u00fc.I ESZK\u00d6Z\u00d6K R\u00c9SZESED\u00c9SEK": { - "Egy\u00e9b tart\u00f3s r\u00e9szesed\u00e9s": {}, - "R\u00e9szesed\u00e9sek \u00e9rt\u00e9khelyesb\u00edt\u00e9se": {}, - "R\u00e9szesed\u00e9sek \u00e9rt\u00e9kveszt\u00e9se, vissza\u00edr\u00e1sa": {}, - "Tart\u00f3s r\u00e9szesed\u00e9s kapcs. v\u00e1llalkoz\u00e1sban": {} - }, - "BERUH\u00c1Z\u00c1SOK, FEL\u00faJ\u00cdT\u00c1SOK": { - "Befejezetlen beruh\u00e1z\u00e1sok": {}, - "Beruh\u00e1z\u00e1sok terven fel\u00fcli \u00e9rt\u00e9kcs\u00f6kk.": {}, - "Fel\u00faj\u00edt\u00e1sok": {} - }, - "EGY\u00c9B BERENDEZ\u00c9SEK, FELSZ., J\u00c1RM\u00dcVEK": { - "Egy\u00e9b g\u00e9pek,felsz,j\u00e1rm. \u00e9rt\u00e9khelyesb\u00edt\u00e9s": {}, - "Egy\u00e9b j\u00e1rm\u00fbvek": {}, - "Irodai, igazgat\u00e1si berendez\u00e9sek": {}, - "\u00dczemi berendez\u00e9sek, g\u00e9pek,felszerel\u00e9sek": {}, - "\u00dczemk\u00f6r\u00f6n kiv\u00fcli berendez\u00e9sek, felsz.": {} - }, - "HITELVISZONYT MEGTESTES\u00cdT\u00d6 \u00c9RT\u00c9KPAP\u00cdROK": { - "Egy\u00e9b v\u00e1llalkoz\u00e1sok \u00e9rt\u00e9kpap\u00edrjai": {}, - "Kapcsolt v\u00e1llalkoz\u00e1sok \u00e9rt\u00e9kpap\u00edrjai": {}, - "Tart\u00f3s diszkont \u00e9rt\u00e9kpap\u00edrok": {}, - "\u00c1llamk\u00f6tv\u00e9nyek": {}, - "\u00c9rt\u00e9kpap\u00edrok \u00e9rt\u00e9kveszt\u00e9se, vissza\u00edr\u00e1sa": {} - }, - "IMMATERI\u00c1LIS JAVAK": { - "Alap\u00edt\u00e1s-\u00e1tszervez\u00e9s akt\u00edv\u00e1lt \u00e9rt\u00e9ke": {}, - "Immateri\u00e1lis javak \u00e9rt\u00e9khelyesb\u00edt\u00e9se": {}, - "K\u00eds\u00e9rleti fejleszt\u00e9s akt\u00edv\u00e1lt \u00e9rt\u00e9ke": {}, - "Szellemi term\u00e9kek": {}, - "Vagyoni \u00e9rt\u00e9k\u00fb jogok": {}, - "\u00dczleti vagy c\u00e9g\u00e9rt\u00e9k": {} - }, - "INGATLANOK, KAPCS. VAGYONI \u00c9RT. JOGOK": { - "Egy\u00e9b \u00e9p\u00edtm\u00e9nyek": {}, - "F\u00f6ldter\u00fclet": {}, - "Ingatlanhoz kapcs. vagyoni \u00e9rt. jogok": {}, - "Ingatlanok \u00e9rt\u00e9khelyesb\u00edt\u00e9se": {}, - "Telek, telkes\u00edt\u00e9s": {}, - "\u00c9p\u00fcletek,\u00e9p\u00fcletr\u00e9szek,tulajdoni h\u00e1nyadok": {}, - "\u00dczemk\u00f6r\u00f6n kiv\u00fcli ingatlanok, \u00e9p\u00fcletek": {} - }, - "M\u00dcSZAKI BERENDEZ\u00c9SEK, G\u00c9PEK, J\u00c1RM\u00dcVEK": { - "M\u00fcszaki g\u00e9pek,felsz,j\u00e1rm. \u00e9rt\u00e9khelyesb.": {}, - "Termel\u00e9sben r\u00e9sztvev\u00f5 j\u00e1rm\u00fbvek": {}, - "Termel\u00f5 g\u00e9pek, berendez\u00e9sek, gy\u00e1rt\u00f3eszk.": {} - }, - "TART\u00d3SAN ADOTT K\u00d6LCS\u00d6N\u00d6K": { - "Egy\u00e9b tart\u00f3s bankbet\u00e9tek": {}, - "Egy\u00e9b tart\u00f3san adott k\u00f6lcs\u00f6n\u00f6k": {}, - "P\u00e9nz\u00fcgyi l\u00edzing miatti tart\u00f3s k\u00f6vetel\u00e9s": {}, - "Tart\u00f3s bankbet\u00e9tek egy\u00e9b r\u00e9sz. v\u00e1ll.-ban": {}, - "Tart\u00f3s bankbet\u00e9tek kapcs. v\u00e1ll.-ban": {}, - "Tart\u00f3san adott k\u00f6lcs\u00f6n egy\u00e9b r\u00e9sz.v\u00e1ll.": {}, - "Tart\u00f3san adott k\u00f6lcs\u00f6n\u00f6k kapcs. v\u00e1ll.": {}, - "Tart\u00f3san adott k\u00f6lcs\u00f6n\u00f6k \u00e9rt\u00e9kveszt\u00e9se": {} - }, - "TENY\u00c9SZ\u00c1LLATOK": { - "Teny\u00e9sz\u00e1llatok": {} - } - }, - "FORR\u00c1SOK (PASSZ\u00cdV\u00c1K)": { - "C\u00c9LTARTAL\u00c9KOK": { - "C\u00e9ltartal\u00e9k v\u00e1rhat\u00f3 k\u00f6telezetts\u00e9gre": {} - }, - "EGY\u00c9B R\u00d6VID LEJ\u00c1RAT\u00fa K\u00d6TELEZETTS\u00c9GEK": { - "El\u00f5zetesen felsz\u00e1m\u00edtott \u00e1lt.forgalmi ad\u00f3": {}, - "Fizetend\u00f5 \u00e1ltal\u00e1nos forgalmi ad\u00f3": {}, - "K\u00f6lts\u00e9gvet\u00e9si befizet\u00e9si k\u00f6t.teljes\u00edt\u00e9se": {}, - "K\u00f6lts\u00e9gvet\u00e9si befizet\u00e9si k\u00f6telezetts\u00e9gek": {}, - "Szem\u00e9lyi j\u00f6vedelemad\u00f3 elsz\u00e1mol\u00e1sa": {}, - "T\u00e1rsas\u00e1gi ad\u00f3 \u00e9s osztal\u00e9kad\u00f3 elsz\u00e1mol\u00e1s": {}, - "V\u00e1m- \u00e9s P\u00e9nz\u00fcgy\u00f5rs\u00e9g elsz\u00e1mol\u00e1si sz\u00e1mla": {}, - "\u00c1fa p\u00e9nz\u00fcgyi elsz\u00e1mol\u00e1si sz\u00e1mla": {}, - "\u00d6nkorm\u00e1nyzati ad\u00f3k elsz\u00e1mol\u00e1si sz\u00e1mla": {} - }, - "HOSSZ\u00da LEJ\u00c1RAT\u00da K\u00d6TELEZETTS\u00c9GEK": { - "Beruh\u00e1z\u00e1si \u00e9s fejleszt\u00e9si hitelek": {}, - "Egy\u00e9b hossz\u00fa lej. k\u00f6telezetts\u00e9gek": {}, - "Egy\u00e9b hossz\u00fa lej\u00e1rat\u00fa hitelek": {}, - "Hossz\u00fa lej\u00e1ratra kapott k\u00f6lcs\u00f6n\u00f6k": {}, - "P\u00e9nz\u00fcgyi l\u00edzinggel kapcsolatos k\u00f6telez.": {}, - "Tartoz\u00e1sok k\u00f6tv\u00e9nykibocs\u00e1t\u00e1sb\u00f3l": {}, - "Tart\u00f3s k\u00f6t. egy\u00e9b r\u00e9sz. v\u00e1ll. szemben": {}, - "Tart\u00f3s k\u00f6t. kapcs. v\u00e1llalkoz\u00e1ssal sz.": {}, - "\u00c1tv\u00e1ltoztathat\u00f3 k\u00f6tv\u00e9nyek": {} - }, - "H\u00c1TRASOROLT K\u00d6TELEZETTS\u00c9GEK": { - "H\u00e1trasorolt k\u00f6telezetts\u00e9g": {} - }, - "PASSZ\u00cdV ID\u00d6BELI ELHAT\u00c1ROL\u00c1S": { - "Bev\u00e9telek passz\u00edv id\u00f5beli elhat\u00e1rol\u00e1sa": {}, - "Halasztott bev\u00e9telek": {}, - "K\u00f6lts\u00e9gek,r\u00e1ford. passz\u00edv id\u00f5beli elhat.": {} - }, - "R\u00d6VID LEJ\u00c1RAT\u00fa K\u00d6TELEZETTS\u00c9GEK": { - "R\u00f6vid lej\u00e1rat\u00fa hitelek": {}, - "R\u00f6vid lej\u00e1rat\u00fa k\u00f6lcs\u00f6n\u00f6k": {}, - "Sz\u00e1ll\u00edt\u00f3k": { - "Belf\u00f6ldi sz\u00e1ll\u00edt\u00f3k": { - "account_type": "Payable" - }, - "K\u00fclf\u00f6ldi sz\u00e1ll\u00edt\u00f3k": { - "account_type": "Payable" - } - }, - "Vev\u00f5kt\u00f5l kapott el\u00f5legek": {} - }, - "SAJ\u00c1T T\u00d6KE": { - "Eredm\u00e9nytartal\u00e9k": {}, - "Jegyzett t\u00f5ke": {}, - "Lek\u00f6t\u00f6tt tartal\u00e9k": {}, - "M\u00e9rleg szerinti eredm\u00e9ny": {}, - "T\u00f5ketartal\u00e9k": {}, - "\u00c9rt\u00e9kel\u00e9si tartal\u00e9k": {} - }, - "\u00c9VI M\u00c9RLEG SZ\u00c1ML\u00c1K": { - "Nyit\u00f3m\u00e9rleg sz\u00e1mla": {} - } - }, - "K\u00c9SZLETEK": { - "ANYAGOK": { - "Seg\u00e9danyagok": {} - }, - "BEFEJEZETLEN TERMEL\u00c9S \u00c9S F\u00c9LK\u00c9SZTERM\u00c9KEK": { - "Befejezetlen termel\u00e9s": {} - }, - "BET\u00c9TD\u00cdJAS G\u00d6NGY\u00d6LEGEK": { - "Bet\u00e9td\u00edjas g\u00f6ngy\u00f6legek": {} - }, - "K\u00c9SZTERM\u00c9KEK": { - "K\u00e9szterm\u00e9kek": {} - }, - "K\u00d6ZVET\u00cdTETT SZOLG\u00c1LTAT\u00c1SOK": { - "K\u00f6zvet\u00edtett szolg\u00e1ltat\u00e1sok": {} - }, - "\u00c1RUK": { - "\u00c1ruk beszerz\u00e9si \u00e1ron": {} - } - }, - "K\u00d6VETEL\u00c9SEK,P\u00c9NZ\u00dcGYI ESZK,AKT\u00cdV ID\u00d6B.ELH": { - "ADOTT EL\u00d6LEGEK": { - "Adott el\u00f5legek": {} - }, - "AKT\u00cdV ID\u00d6BELI ELHAT\u00c1ROL\u00c1S": { - "Akt\u00edv id\u00f5beli elhat\u00e1rol\u00e1sa": {} - }, - "EGY\u00c9B K\u00d6VETEL\u00c9SEK": { - "K\u00fcl\u00f6nf\u00e9le egy\u00e9b k\u00f6vetel\u00e9sek": {}, - "Munkav\u00e1llal\u00f3kkal szembeni k\u00f6vetel\u00e9s": {} - }, - "K\u00d6VETEL\u00c9SEK \u00c1RUSZ\u00c1LL.- SZOLG\u00c1LTAT\u00c1SB\u00d3L": { - "Belf\u00f6ldi k\u00f6vetel\u00e9sek": { - "account_type": "Receivable" - }, - "K\u00fclf\u00f6ldi k\u00f6vetel\u00e9sek": { - "account_type": "Receivable" - } - }, - "P\u00c9NZESZK\u00d6Z\u00d6K": { - "Deviza bet\u00e9tsz\u00e1mla": { - "account_type": "Bank" - }, - "Elk\u00fcl\u00f6n\u00edtett bet\u00e9tsz\u00e1ml\u00e1k": { - "account_type": "Bank" - }, - "Elsz\u00e1mol\u00e1si bet\u00e9tsz\u00e1mla": { - "Banksz\u00e1mla": { - "account_type": "Bank" - } - }, - "P\u00e9nzhelyettes\u00edt\u00f5 eszk. (utalv\u00e1ny, jegy)": { - "account_type": "Bank" - }, - "P\u00e9nzt\u00e1rak": { - "P\u00e9nzt\u00e1r": { - "account_type": "Cash" - } - }, - "Valuta p\u00e9nzt\u00e1r": { - "account_type": "Cash" - }, - "\u00c1tvezet\u00e9si sz\u00e1mla": { - "account_type": "Bank" - } - }, - "\u00c9RT\u00c9KPAP\u00cdROK": { - "Egy\u00e9b r\u00e9szesed\u00e9s": {}, - "Forgat\u00e1si c\u00e9l\u00fa hitelv. m. \u00e9rt\u00e9kpap\u00edrok": {}, - "R\u00e9szesed\u00e9s kapcsolt v\u00e1llalkoz\u00e1sban": {}, - "Saj\u00e1t r\u00e9szv\u00e9nyek, saj\u00e1t \u00fczletr\u00e9szek": {} - } - }, - "root_type": "" - } - } -} \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/nl_l10nnl_chart_template.json b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/nl_l10nnl_chart_template.json deleted file mode 100644 index 8009a10388f..00000000000 --- a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/nl_l10nnl_chart_template.json +++ /dev/null @@ -1,716 +0,0 @@ -{ - "country_code": "nl", - "name": "Nederlands - Grootboekschema", - "tree": { - "FABRIKAGEREKENINGEN": { - "root_type": "" - }, - "FINANCIELE REKENINGEN, KORTLOPENDE VORDERINGEN EN SCHULDEN": { - "KORTLOPENDE SCHULDEN": { - "Accountantskosten": {}, - "Af te dragen Btw-verlegd": { - "account_type": "Tax" - }, - "Afdracht loonheffing": {}, - "Btw af te dragen hoog": { - "account_type": "Tax" - }, - "Btw af te dragen laag": { - "account_type": "Tax" - }, - "Btw af te dragen overig": { - "account_type": "Tax" - }, - "Btw oude jaren": { - "account_type": "Tax" - }, - "Btw te vorderen hoog": { - "account_type": "Tax" - }, - "Btw te vorderen laag": { - "account_type": "Tax" - }, - "Btw te vorderen overig": { - "account_type": "Tax" - }, - "Btw-afdracht": { - "account_type": "Tax" - }, - "Crediteuren": { - "account_type": "Payable" - }, - "Dividend": {}, - "Dividendbelasting": {}, - "Energiekosten": {}, - "Investeringsaftrek": {}, - "Loonheffing": {}, - "Overige te betalen posten": {}, - "Pensioenpremies": {}, - "Premie WIR": {}, - "Rekening-courant inkoopvereniging": {}, - "Rente": {}, - "Sociale lasten": {}, - "Tanti\u00e8mes": {}, - "Te vorderen Btw-verlegd": { - "account_type": "Tax" - }, - "Telefoon/telefax": {}, - "Termijnen onderh. werk": {}, - "Vakantiedagen": {}, - "Vakantiegeld": {}, - "Vakantiezegels": {}, - "Vennootschapsbelasting": {}, - "Vooruit ontvangen bedr.": {} - }, - "LIQUIDE MIDDELEN": { - "ABN-AMRO bank": { - "account_type": "Cash" - }, - "BIZNER bank": { - "account_type": "Cash" - }, - "Bankbetaalkaarten": {}, - "Effecten": {}, - "Girobetaalkaarten": {}, - "Kas": { - "account_type": "Cash" - }, - "Kas valuta": { - "account_type": "Cash" - }, - "Kleine kas": { - "account_type": "Cash" - }, - "Kruisposten": {}, - "Postbank": { - "account_type": "Cash" - }, - "RABO bank": { - "account_type": "Cash" - } - }, - "VORDERINGEN": { - "Debiteuren": { - "account_type": "Receivable" - }, - "Dubieuze debiteuren": {}, - "Overige vorderingen": {}, - "Rekening-courant directie": {}, - "Te ontvangen ziekengeld": {}, - "Voorschotten personeel": {}, - "Vooruitbetaalde kosten": {}, - "Voorziening dubieuze debiteuren": {} - }, - "root_type": "" - }, - "INDIRECTE KOSTEN": { - "root_type": "" - }, - "KOSTENREKENINGEN": { - "AFSCHRIJVINGEN": { - "Aanhangwagens": {}, - "Aankoopkosten": {}, - "Aanloopkosten": {}, - "Auteursrechten": {}, - "Bedrijfsgebouwen": {}, - "Bedrijfsinventaris": {}, - "Drankvergunningen": {}, - "Fabrieksinventaris": {}, - "Gebouwen": {}, - "Gereedschappen": {}, - "Goodwill": {}, - "Grondverbetering": {}, - "Heftrucks": {}, - "Kantine-inventaris": {}, - "Kantoorinventaris": {}, - "Kantoormachines": {}, - "Licenties": {}, - "Machines": {}, - "Magazijninventaris": {}, - "Octrooien": {}, - "Ontwikkelingskosten": {}, - "Pachtersinvestering": {}, - "Parkeerplaats": {}, - "Personenauto's": {}, - "Rijwielen en bromfietsen": {}, - "Tonnagevergunningen": {}, - "Verbouwingen": {}, - "Vergunningen": {}, - "Voorraadverschillen": {}, - "Vrachtauto's": {}, - "Winkels": {}, - "Woon-winkelhuis": {} - }, - "ALGEMENE KOSTEN": { - "Accountantskosten": {}, - "Advieskosten": {}, - "Assuranties": {}, - "Bankkosten": {}, - "Juridische kosten": {}, - "Overige algemene kosten": {}, - "Toev. Ass. eigen risico": {} - }, - "BEDRIJFSKOSTEN": { - "Assuranties": {}, - "Energie (krachtstroom)": {}, - "Gereedschappen": {}, - "Hulpmaterialen": {}, - "Huur inventaris": {}, - "Huur machines": {}, - "Leasing invent.operational": {}, - "Leasing mach. operational": {}, - "Onderhoud inventaris": {}, - "Onderhoud machines": {}, - "Ophalen/vervoer afval": {}, - "Overige bedrijfskosten": {} - }, - "FINANCIERINGSKOSTEN": { - "Overige rentebaten": {}, - "Overige rentelasten": {}, - "Rente bankkrediet": {}, - "Rente huurkoopcontracten": {}, - "Rente hypotheek": {}, - "Rente leasecontracten": {}, - "Rente lening o/g": {}, - "Rente lening u/g": {} - }, - "HUISVESTINGSKOSTEN": { - "Assurantie onroerend goed": {}, - "Belastingen onr. Goed": {}, - "Energiekosten": {}, - "Groot onderhoud onr. Goed": {}, - "Huur": {}, - "Huurwaarde woongedeelte": {}, - "Onderhoud onroerend goed": {}, - "Ontvangen huren": {}, - "Overige huisvestingskosten": {}, - "Pacht": {}, - "Schoonmaakkosten": {}, - "Toevoeging egalisatieres. Groot onderhoud": {} - }, - "KANTOORKOSTEN": { - "Administratiekosten": {}, - "Contributies/abonnementen": {}, - "Huur kantoorapparatuur": {}, - "Internetaansluiting": {}, - "Kantoorbenodigdh./drukw.": {}, - "Onderhoud kantoorinvent.": {}, - "Overige kantoorkosten": {}, - "Porti": {}, - "Telefoon/telefax": {} - }, - "OVERIGE BATEN EN LASTEN": { - "Betaalde schadevergoed.": {}, - "Boekverlies vaste activa": {}, - "Boekwinst van vaste activa": {}, - "K.O. regeling OB": {}, - "Kasverschillen": {}, - "Kosten loonbelasting": {}, - "Kosten omzetbelasting": {}, - "Nadelige koersverschillen": {}, - "Naheffing bedrijfsver.": {}, - "Ontvangen schadevergoed.": {}, - "Overige baten": {}, - "Overige lasten": {}, - "Voordelige koersverschil.": {} - }, - "PERSONEELSKOSTEN": { - "Autokostenvergoeding": {}, - "Bedrijfskleding": {}, - "Belastingvrije uitkeringen": {}, - "Bijzondere beloningen": {}, - "Congressen, seminars en symposia": {}, - "Gereedschapsgeld": {}, - "Geschenken personeel": {}, - "Gratificaties": {}, - "Inhouding pensioenpremies": {}, - "Inhouding sociale lasten": {}, - "Kantinekosten": {}, - "Lonen en salarissen": {}, - "Loonwerk": {}, - "Managementvergoedingen": {}, - "Opleidingskosten": {}, - "Oprenting stamrechtverpl.": {}, - "Overhevelingstoeslag": {}, - "Overige kostenverg.": {}, - "Overige personeelskosten": {}, - "Overige uitkeringen": {}, - "Pensioenpremies": {}, - "Provisie": {}, - "Reiskosten": {}, - "Rijwielvergoeding": {}, - "Sociale lasten": {}, - "Tanti\u00e8mes": {}, - "Thuiswerkers": {}, - "Toev. Backservice pens.verpl.": {}, - "Toevoeging pensioenverpl.": {}, - "Uitkering ziekengeld": {}, - "Uitzendkrachten": {}, - "Vakantiebonnen": {}, - "Vakantiegeld": {}, - "Vergoeding studiekosten": {}, - "Wervingskosten personeel": {} - }, - "VERKOOPKOSTEN": { - "Advertenties": {}, - "Afschrijving dubieuze deb.": {}, - "Beurskosten": {}, - "Etalagekosten": {}, - "Exportkosten": {}, - "Kascorrecties": {}, - "Overige verkoopkosten": {}, - "Provisie": {}, - "Reclame": {}, - "Reis en verblijfkosten": {}, - "Relatiegeschenken": {}, - "Representatiekosten": {}, - "Uitgaande vrachten": {}, - "Veilingkosten": {}, - "Verpakkingsmateriaal": {}, - "Websitekosten": {} - }, - "VERVOERSKOSTEN": { - "Assuranties auto's": {}, - "Brandstoffen": {}, - "Leasing auto's": {}, - "Onderhoud personenauto's": {}, - "Onderhoud vrachtauto's": {}, - "Overige vervoerskosten": {}, - "Priv\u00e9-gebruik auto's": {}, - "Wegenbelasting": {} - }, - "root_type": "" - }, - "OVERIGE RESULTATEN": { - "Memoriaal": { - "account_type": "Cash" - }, - "Opbrengsten deelnemingen": {}, - "Reorganisatiekosten": {}, - "Verlies verkoop deelnem.": {}, - "Voorz. Verlies deelnem.": {}, - "Vpb bijzonder resultaat": {}, - "Vpb normaal resultaat": {}, - "Winst": {}, - "Winst bij verkoop deelnem.": {}, - "root_type": "" - }, - "TUSSENREKENINGEN": { - "Betaalwijze cadeaubonnen": { - "account_type": "Cash" - }, - "Betaalwijze chipknip": { - "account_type": "Cash" - }, - "Betaalwijze contant": { - "account_type": "Cash" - }, - "Betaalwijze pin": { - "account_type": "Cash" - }, - "Inkopen Nederland hoog": { - "account_type": "Cash" - }, - "Inkopen Nederland laag": { - "account_type": "Cash" - }, - "Inkopen Nederland onbelast": { - "account_type": "Cash" - }, - "Inkopen Nederland overig": { - "account_type": "Cash" - }, - "Inkopen Nederland verlegd": { - "account_type": "Cash" - }, - "Inkopen binnen EU hoog": { - "account_type": "Cash" - }, - "Inkopen binnen EU laag": { - "account_type": "Cash" - }, - "Inkopen binnen EU overig": { - "account_type": "Cash" - }, - "Inkopen buiten EU hoog": { - "account_type": "Cash" - }, - "Inkopen buiten EU laag": { - "account_type": "Cash" - }, - "Inkopen buiten EU overig": { - "account_type": "Cash" - }, - "Kassa 1": { - "account_type": "Cash" - }, - "Kassa 2": { - "account_type": "Cash" - }, - "Netto lonen": { - "account_type": "Cash" - }, - "Tegenrekening Inkopen": { - "account_type": "Cash" - }, - "Tussenrek. autom. betalingen": { - "account_type": "Cash" - }, - "Tussenrek. autom. loonbetalingen": { - "account_type": "Cash" - }, - "Tussenrek. cadeaubonbetalingen": { - "account_type": "Cash" - }, - "Tussenrekening balans": { - "account_type": "Cash" - }, - "Tussenrekening chipknip": { - "account_type": "Cash" - }, - "Tussenrekening correcties": { - "account_type": "Cash" - }, - "Tussenrekening pin": { - "account_type": "Cash" - }, - "Vraagposten": { - "account_type": "Cash" - }, - "root_type": "" - }, - "VASTE ACTIVA, EIGEN VERMOGEN, LANGLOPEND VREEMD VERMOGEN EN VOORZIENINGEN": { - "EIGEN VERMOGEN": { - "Aandelenkapitaal": { - "account_type": "Equity" - }, - "Assuranties": { - "account_type": "Equity" - }, - "Buitengewone lasten": { - "account_type": "Equity" - }, - "Giften": { - "account_type": "Equity" - }, - "Huishoudgeld": { - "account_type": "Equity" - }, - "Inkomstenbelasting": { - "account_type": "Equity" - }, - "Kapitaal": { - "account_type": "Equity" - }, - "Overige persoonlijke verplichtingen": { - "account_type": "Equity" - }, - "Overige priv\u00e9-uitgaven": { - "account_type": "Equity" - }, - "Overige reserves": { - "account_type": "Equity" - }, - "Premie lijfrenteverzekeringen": { - "account_type": "Equity" - }, - "Premie volksverzekeringen": { - "account_type": "Equity" - }, - "Priv\u00e9-gebruik": { - "account_type": "Equity" - }, - "Priv\u00e9-opnamen/stortingen": { - "account_type": "Equity" - }, - "Vermogensbelasting": { - "account_type": "Equity" - }, - "WAO en ziekengeldverzekeringen": { - "account_type": "Equity" - }, - "Wettelijke reserves": { - "account_type": "Equity" - } - }, - "FINANCIELE VASTE ACTIVA EN LANGLOPENDE VORDERINGEN": { - "FINANCIELE VASTE ACTIVA": { - "Aandeel inkoopcombinatie": {}, - "Meerderheidsdeelnemingen": {}, - "Minderheidsdeelnemingen": {} - }, - "LANGLOPENDE VORDERINGEN": { - "Financieringskosten": {}, - "Financieringskosten huurkoop": {}, - "Hypotheken u/g 1": {}, - "Hypotheken u/g 2": {}, - "Hypotheken u/g 3": {}, - "Leningen u/g 1": {}, - "Leningen u/g 2": {}, - "Leningen u/g 3": {}, - "Leningen u/g 4": {}, - "Leningen u/g 5": {}, - "Vorderingen op deelnemingen": {}, - "Waarborgsommen": {} - } - }, - "IMMATERIELE ACTIVA": { - "Aanschafwaarde Aanloopkosten": {}, - "Aanschafwaarde Auteursrechten": {}, - "Aanschafwaarde Drankvergunningen": {}, - "Aanschafwaarde Goodwill": {}, - "Aanschafwaarde Octrooien": {}, - "Aanschafwaarde Ontwikkelingskosten": {}, - "Aanschafwaarde Tonnagevergunningen": {}, - "Aanschafwaarde Vergunningen": {}, - "Afschrijving Aanloopkosten": {}, - "Afschrijving Auteursrechten": {}, - "Afschrijving Drankvergunningen": {}, - "Afschrijving Goodwill": {}, - "Afschrijving Licenties": {}, - "Afschrijving Octrooien": {}, - "Afschrijving Ontwikkelingskosten": {}, - "Afschrijving Tonnagevergunningen": {}, - "Afschrijving Vergunningen": {} - }, - "LANGLOPENDE SCHULDEN EN AFLOSSINGEN": { - "AFLOSSINGEN": { - "Huurkoopverplichtingen": {}, - "Hypotheek o/g 1": {}, - "Hypotheek o/g 2": {}, - "Hypotheek o/g 3": {}, - "Hypotheek o/g 4": {}, - "Hypotheek o/g 5": {}, - "Lease-verplichtingen": {} - }, - "LANGLOPENDE SCHULDEN": { - "Huurkoopverplichtingen": {}, - "Hypotheken o/g 1": {}, - "Hypotheken o/g 2": {}, - "Hypotheken o/g 3": {}, - "Hypotheken o/g 4": {}, - "Hypotheken o/g 5": {}, - "Lease-verplichtingen": {}, - "Leningen o/g 1": {}, - "Leningen o/g 2": {}, - "Leningen o/g 3": {}, - "Leningen o/g 4": {}, - "Leningen o/g 5": {}, - "Rekening-courant directie": {} - } - }, - "MACHINES EN INVENTARIS": { - "INVENTARIS": { - "Aanschafwaarde Bedrijfsinventaris": {}, - "Aanschafwaarde Fabrieksinventaris": {}, - "Aanschafwaarde Gereedschappen": {}, - "Aanschafwaarde Kantine-inventaris": {}, - "Aanschafwaarde Kantoorinventaris": {}, - "Aanschafwaarde Kantoormachines": {}, - "Aanschafwaarde Magazijninventaris": {}, - "Afschrijving Bedrijfsinventaris": {}, - "Afschrijving Fabrieksinventaris": {}, - "Afschrijving Gereedschappen": {}, - "Afschrijving Kantine-inventaris": {}, - "Afschrijving Kantoorinventaris": {}, - "Afschrijving Kantoormachines": {}, - "Afschrijving Magazijninventaris": {} - }, - "MACHINES": { - "Aanschafwaarde Machines 1": {}, - "Aanschafwaarde Machines 2": {}, - "Aanschafwaarde Machines 3": {}, - "Aanschafwaarde Machines 4": {}, - "Aanschafwaarde Machines 5": {}, - "Afschrijving Machines 1": {}, - "Afschrijving Machines 2": {}, - "Afschrijving Machines 3": {}, - "Afschrijving Machines 4": {}, - "Afschrijving Machines 5": {} - } - }, - "ONROERENDE GOEDEREN": { - "Aanschafwaarde Aanloopkosten": {}, - "Aanschafwaarde Bedrijfsgebouwen": {}, - "Aanschafwaarde Gebouwen": {}, - "Aanschafwaarde Grondverbetering": {}, - "Aanschafwaarde Landerijen": {}, - "Aanschafwaarde Ondergrond gebouwen": {}, - "Aanschafwaarde Pachtersinvesteringen": {}, - "Aanschafwaarde Parkeerplaats": {}, - "Aanschafwaarde Verbouwingen": {}, - "Aanschafwaarde Winkels": {}, - "Aanschafwaarde Woon-winkelhuis": {}, - "Afschrijving Aanloopkosten": {}, - "Afschrijving Bedrijfsgebouwen": {}, - "Afschrijving Gebouwen": {}, - "Afschrijving Grondverbetering": {}, - "Afschrijving Pachtersinvesteringen": {}, - "Afschrijving Parkeerplaats": {}, - "Afschrijving Verbouwingen": {}, - "Afschrijving Winkels": {}, - "Afschrijving Woon-winkelhuis": {} - }, - "VERVOERMIDDELEN": { - "Aanschafwaarde Aanhangwagens": {}, - "Aanschafwaarde Heftrucks": {}, - "Aanschafwaarde Personenauto's": {}, - "Aanschafwaarde Rijwielen en bromfietsen": {}, - "Aanschafwaarde Vrachtauto's": {}, - "Afschrijving Aanhangwagens": {}, - "Afschrijving Heftrucks": {}, - "Afschrijving Personenauto's": {}, - "Afschrijving Rijwielen en bromfietsen": {}, - "Afschrijving Vrachtauto's": {} - }, - "VOORZIENINGEN": { - "Assurantie eigen risico": { - "account_type": "Equity" - }, - "Backservice pensioenverpl.": { - "account_type": "Equity" - }, - "Egalisatierekening WIR": { - "account_type": "Equity" - }, - "Egalisatieres. grootonderh.": { - "account_type": "Equity" - }, - "Garantieverplichtingen": { - "account_type": "Equity" - }, - "Latente belastingverpl.": { - "account_type": "Equity" - }, - "Pens.voorz. eigen beheer": { - "account_type": "Equity" - }, - "Pensioenverplichtingen": { - "account_type": "Equity" - }, - "Stamrechtverplichtingen": { - "account_type": "Equity" - }, - "Vervangingsreserve": { - "account_type": "Equity" - }, - "Voorziening deelnemingen": { - "account_type": "Equity" - } - }, - "root_type": "" - }, - "VERKOOPRESULTATEN": { - "Diensten fabric. 0% niet-EU": {}, - "Diensten fabricage 0% EU": {}, - "Diensten fabricage hoog": {}, - "Diensten fabricage laag": {}, - "Diensten fabricage overig": {}, - "Diensten handel 0% EU": {}, - "Diensten handel 0% niet-EU": {}, - "Diensten handel hoog tarief": {}, - "Diensten handel laag tarief": {}, - "Verkopen Fabric. 0% niet-EU": {}, - "Verkopen Handel 0% niet-EU": {}, - "Verkopen fabric. 0 % EU": {}, - "Verkopen fabricage hoog": {}, - "Verkopen fabricage laag": {}, - "Verkopen fabricage overig": {}, - "Verkopen handel 0% EU": {}, - "Verkopen handel hoog": {}, - "Verkopen handel laag": {}, - "Verkopen handel overig": {}, - "Verleende Kredietbep. fabricage": {}, - "Verleende Kredietbep. handel": {}, - "root_type": "" - }, - "VOORRAAD GEREED PRODUCT EN ONDERHANDEN WERK": { - "Betalingskort. crediteuren": {}, - "Garantiekosten": {}, - "Hulpmaterialen": {}, - "Inkomende vrachten": {}, - "Inkoop import buiten EU hoog": {}, - "Inkoop import buiten EU laag": {}, - "Inkoop import buiten EU overig": {}, - "Inkoopbonussen": {}, - "Inkoopkosten": {}, - "Inkoopprovisie": {}, - "Inkopen BTW verlegd": {}, - "Inkopen EU hoog tarief": {}, - "Inkopen EU laag tarief": {}, - "Inkopen EU overig": {}, - "Inkopen hoog": {}, - "Inkopen laag": {}, - "Inkopen nul": {}, - "Inkopen overig": {}, - "Invoerkosten": {}, - "Kosten inkoopvereniging": {}, - "Kostprijs omzet grondstoffen": {}, - "Kostprijs omzet handelsgoederen": {}, - "Onttrekking uitgev.garantie": {}, - "Priv\u00e9-gebruik goederen": {}, - "Tegenrekening inkoop": {}, - "Toev. Voorz. incour. grondst.": {}, - "Toevoeging garantieverpl.": {}, - "Toevoeging voorz. incour. handelsgoed.": {}, - "Uitbesteed werk": {}, - "Voorz. Incourourant grondst.": {}, - "Voorz.incour. handelsgoed.": {}, - "root_type": "" - }, - "VOORRAAD GRONDSTOFFEN, HULPMATERIALEN EN HANDELSGOEDEREN": { - "Emballage": { - "account_type": "Cash" - }, - "Gereed product 1": { - "account_type": "Cash" - }, - "Gereed product 2": { - "account_type": "Cash" - }, - "Goederen 1": { - "account_type": "Cash" - }, - "Goederen 2": { - "account_type": "Cash" - }, - "Goederen in consignatie": { - "account_type": "Cash" - }, - "Goederen onderweg": { - "account_type": "Cash" - }, - "Grondstoffen 1": { - "account_type": "Cash" - }, - "Grondstoffen 2": { - "account_type": "Cash" - }, - "Halffabrikaten 1": { - "account_type": "Cash" - }, - "Halffabrikaten 2": { - "account_type": "Cash" - }, - "Hulpstoffen 1": { - "account_type": "Cash" - }, - "Hulpstoffen 2": { - "account_type": "Cash" - }, - "Kantoorbenodigdheden": { - "account_type": "Cash" - }, - "Onderhanden werk": { - "account_type": "Cash" - }, - "Verpakkingsmateriaal": { - "account_type": "Cash" - }, - "Zegels": { - "account_type": "Cash" - }, - "root_type": "" - } - } -} \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ar_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ar_chart_of_accounts.json index 367ea60bbce..057d43761bd 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ar_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ar_chart_of_accounts.json @@ -2,418 +2,839 @@ "country_code": "ar", "name": "Argentina - Chart of Accounts", "tree": { - "1.0.0.00.00 - ACTIVO": { - "1.1.0.00.00 - ACTIVO CORRIENTE": { - "1.1.1.00.00 - CAJA Y BANCOS": { - "1.1.1.01.00 - CAJAS": { - "1.1.1.01.01 - Caja": {}, - "1.1.1.01.02 - Caja chica": {}, - "1.1.1.01.03 - Caja en Moneda Extranjera": {}, - "1.1.1.01.04 - Valores a depositar": {}, - "1.1.1.01.05 - Tarjetas - Cupones": {}, + "ACTIVO": { + "ACTIVO CORRIENTE": { + "CAJA Y BANCOS": { + "BANCOS": { + "Banco de la Nacio\u0301n Argentina(ejemplo) c/c en": { + "account_number": "1.1.1.02.01" + }, + "Banco del exterior": { + "account_number": "1.1.1.02.03" + }, + "account_number": "1.1.1.02.00", + "account_type": "Bank" + }, + "CAJAS": { + "Caja": { + "account_number": "1.1.1.01.01" + }, + "Caja chica": { + "account_number": "1.1.1.01.02" + }, + "Caja en Moneda Extranjera": { + "account_number": "1.1.1.01.03" + }, + "Tarjetas - Cupones": { + "account_number": "1.1.1.01.05" + }, + "Valores a depositar": { + "account_number": "1.1.1.01.04" + }, + "account_number": "1.1.1.01.00", "account_type": "Cash" }, - "1.1.1.02.00 - BANCOS": { - "1.1.1.02.01 - Banco de la Nacio\u0301n Argentina(ejemplo) c/c en": {}, - "1.1.1.02.03 - Banco del exterior": {}, - "account_type": "Bank" - } + "account_number": "1.1.1.00.00" }, - "1.1.2.00.00 - INVERSIONES TEMPORARIAS": { - "1.1.2.01.00 - INVERSIONES EN ACCIONES": { - "1.1.2.01.01 - Acciones": { - "account_type": "Receivable" - } - }, - "1.1.2.02.00 - DEPO\u0301SITOS A PLAZO FIJO": { - "1.1.2.02.01 - Depo\u0301sitos a Plazo Fijo en pesos": { - "account_type": "Receivable" - }, - "1.1.2.02.02 - Depo\u0301sitos a Plazo Fijo en moneda": { - "account_type": "Receivable" - } - } - }, - "1.1.3.00.00 - CRE\u0301DITOS POR VENTAS DE SERVICIOS": { - "1.1.3.01.00 - DEUDORES EN CTA. CTE": { - "1.1.3.01.01 - Deudores locales": { - "account_type": "Receivable" - }, - "1.1.3.01.02 - Deudores del exterior": { - "account_type": "Receivable" - }, - "1.1.3.01.03 - Deudores Morosos": { + "CRE\u0301DITOS POR VENTAS DE SERVICIOS": { + "DEUDORES EN CTA. CTE": { + "Deudores Morosos": { + "account_number": "1.1.3.01.03", "account_type": "Chargeable" }, - "1.1.3.01.04 - Deudores en Gestio\u0301n Judicial": {} - }, - "1.1.3.02.00 - Documentos a cobrar por Vas. de Servicios": { - "account_type": "Receivable" - }, - "1.1.3.03.00 - Previsio\u0301n para deudores incobrables": {} - }, - "1.1.4.00.00 - OTROS CRE\u0301DITOS CORRIENTES": { - "1.1.4.01.00 - CRE\u0301DITOS IMPOSITIVOS CORRIENTES": { - "1.1.4.01.01 - Anticipos Impuesto a las Ganancias": {}, - "1.1.4.01.02 - Anticipos Impuesto a los Ingresos Brutos": {}, - "1.1.4.01.03 - Percepciones y Retenciones Impto. a las Ganancias": {}, - "1.1.4.01.04 - Percepciones y Retenciones Impto. a los": {}, - "1.1.4.01.05 - IVA Cre\u0301dito Fiscal": {}, - "1.1.4.01.06 - IVA Cre\u0301dito Fiscal Exportacio\u0301n": {}, - "1.1.4.01.07 - IVA Saldo a Favor Te\u0301cnico": {}, - "1.1.4.01.08 - IVA Saldo a Favor Te\u0301cnico": {}, - "1.1.4.01.09 - IVA Saldo a Favor de Libre": {}, - "1.1.4.01.10 - Percepciones y Retenciones de IVA": {}, - "1.1.4.01.11 - Cre\u0301ditos por quebrantos impositivos no": {}, - "1.1.4.01.12 - Activos por Impuesto Diferido (Ctes.)": {} - }, - "1.1.4.02.00 - CRE\u0301DITOS DIVERSOS CORRIENTES": { - "1.1.4.02.01 - Cuentas Particulares Directores": {}, - "1.1.4.02.02 - Cuentas Particulares Socios/Accionistas": {}, - "1.1.4.02.03 - Anticipos a Proveedores (No cong.": { + "Deudores del exterior": { + "account_number": "1.1.3.01.02", "account_type": "Receivable" }, - "1.1.4.02.04 - Anticipos de Sueldos": {}, - "1.1.4.02.05 - Pre\u0301stamos al personal": {}, - "1.1.4.02.06 - Depo\u0301sitos pendientes de acreditacio\u0301n": {}, - "1.1.4.02.07 - Arrendamiento pagado por adelantado": {} - } + "Deudores en Gestio\u0301n Judicial": { + "account_number": "1.1.3.01.04" + }, + "Deudores locales": { + "account_number": "1.1.3.01.01", + "account_type": "Receivable" + }, + "account_number": "1.1.3.01.00" + }, + "Documentos a cobrar por Vas. de Servicios": { + "account_number": "1.1.3.02.00", + "account_type": "Receivable" + }, + "Previsio\u0301n para deudores incobrables": { + "account_number": "1.1.3.03.00" + }, + "account_number": "1.1.3.00.00" }, - "1.1.5.00.00 - OTROS ACTIVOS CORRIENTES": { - "is_group": 1 - }, - "1.1.6.00.00 - INVENTARIOS": { + "INVENTARIOS": { + "account_number": "1.1.6.00.00", "account_type": "Stock", "is_group": 1 - } + }, + "INVERSIONES TEMPORARIAS": { + "DEPO\u0301SITOS A PLAZO FIJO": { + "Depo\u0301sitos a Plazo Fijo en moneda": { + "account_number": "1.1.2.02.02", + "account_type": "Receivable" + }, + "Depo\u0301sitos a Plazo Fijo en pesos": { + "account_number": "1.1.2.02.01", + "account_type": "Receivable" + }, + "account_number": "1.1.2.02.00" + }, + "INVERSIONES EN ACCIONES": { + "Acciones": { + "account_number": "1.1.2.01.01", + "account_type": "Receivable" + }, + "account_number": "1.1.2.01.00" + }, + "account_number": "1.1.2.00.00" + }, + "OTROS ACTIVOS CORRIENTES": { + "account_number": "1.1.5.00.00", + "is_group": 1 + }, + "OTROS CRE\u0301DITOS CORRIENTES": { + "CRE\u0301DITOS DIVERSOS CORRIENTES": { + "Anticipos a Proveedores (No cong.": { + "account_number": "1.1.4.02.03", + "account_type": "Receivable" + }, + "Anticipos de Sueldos": { + "account_number": "1.1.4.02.04" + }, + "Arrendamiento pagado por adelantado": { + "account_number": "1.1.4.02.07" + }, + "Cuentas Particulares Directores": { + "account_number": "1.1.4.02.01" + }, + "Cuentas Particulares Socios/Accionistas": { + "account_number": "1.1.4.02.02" + }, + "Depo\u0301sitos pendientes de acreditacio\u0301n": { + "account_number": "1.1.4.02.06" + }, + "Pre\u0301stamos al personal": { + "account_number": "1.1.4.02.05" + }, + "account_number": "1.1.4.02.00" + }, + "CRE\u0301DITOS IMPOSITIVOS CORRIENTES": { + "Activos por Impuesto Diferido (Ctes.)": { + "account_number": "1.1.4.01.12" + }, + "Anticipos Impuesto a las Ganancias": { + "account_number": "1.1.4.01.01" + }, + "Anticipos Impuesto a los Ingresos Brutos": { + "account_number": "1.1.4.01.02" + }, + "Cre\u0301ditos por quebrantos impositivos no": { + "account_number": "1.1.4.01.11" + }, + "IVA Cre\u0301dito Fiscal": { + "account_number": "1.1.4.01.05" + }, + "IVA Cre\u0301dito Fiscal Exportacio\u0301n": { + "account_number": "1.1.4.01.06" + }, + "IVA Saldo a Favor Te\u0301cnico": { + "account_number": "1.1.4.01.07" + }, + "IVA Saldo a Favor de Libre": { + "account_number": "1.1.4.01.09" + }, + "Percepciones y Retenciones Impto. a las Ganancias": { + "account_number": "1.1.4.01.03" + }, + "Percepciones y Retenciones Impto. a los": { + "account_number": "1.1.4.01.04" + }, + "Percepciones y Retenciones de IVA": { + "account_number": "1.1.4.01.10" + }, + "account_number": "1.1.4.01.00" + }, + "account_number": "1.1.4.00.00" + }, + "account_number": "1.1.0.00.00" }, - "1.2.0.00.00 - ACTIVO NO CORRIENTE": { - "1.2.1.00.00 - INVERSIONES PERMANENTES": { - "1.2.1.01.00 - BONOS DE DEUDA": { - "1.2.1.01.01 - Ti\u0301tulos Deuda Pu\u0301blica (Pesos)": { + "ACTIVO NO CORRIENTE": { + "ACTIVOS INTANGIBLES": { + "MARCAS Y PATENTES": { + "Amortizaciones Acumuladas Marcas y": { + "account_number": "1.2.3.01.03" + }, + "Marcas y Patentes Actualizaciones": { + "account_number": "1.2.3.01.02" + }, + "Marcas y Patentes Valores Originales": { + "account_number": "1.2.3.01.01" + }, + "account_number": "1.2.3.01.00" + }, + "account_number": "1.2.3.00.00" + }, + "BIENES DE USO": { + "HERRAMIENTAS": { + "Amortizaciones Acumuladas": { + "account_number": "1.2.2.09.03", + "account_type": "Depreciation" + }, + "Herramientas Ajuste": { + "account_number": "1.2.2.09.02" + }, + "Herramientas Valores Originales": { + "account_number": "1.2.2.09.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.09.00" + }, + "INMUEBLES": { + "Amortizaciones Acumuladas Inmuebles": { + "account_number": "1.2.2.01.03", + "account_type": "Depreciation" + }, + "Inmuebles Actualizaciones": { + "account_number": "1.2.2.01.02" + }, + "Inmuebles Valores originales": { + "account_number": "1.2.2.01.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.01.00" + }, + "INSTALACIONES": { + "Amortizaciones Acumuladas": { + "account_number": "1.2.2.08.03", + "account_type": "Depreciation" + }, + "Instalaciones Ajuste": { + "account_number": "1.2.2.08.02" + }, + "Instalaciones Valores Originales": { + "account_number": "1.2.2.08.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.08.00" + }, + "MAQUINARIAS Y EQUIPOS": { + "Amortizaciones Acumuladas Maquinarias": { + "account_number": "1.2.2.02.03", + "account_type": "Depreciation" + }, + "Maquinarias y Equipos Actualizaciones": { + "account_number": "1.2.2.02.02" + }, + "Maquinarias y Equipos Valores de origen": { + "account_number": "1.2.2.02.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.02.00" + }, + "MUEBLES Y U\u0301TILES": { + "Amortizaciones Acumuladas Muebles y": { + "account_number": "1.2.2.03.03", + "account_type": "Depreciation" + }, + "Muebles y U\u0301tiles Actualizaciones": { + "account_number": "1.2.2.03.02" + }, + "Muebles y U\u0301tiles Valores de Origen": { + "account_number": "1.2.2.03.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.03.00" + }, + "RODADOS": { + "Amortizaciones Acumuladas Rodados": { + "account_number": "1.2.2.04.03", + "account_type": "Depreciation" + }, + "Rodados Actualizaciones": { + "account_number": "1.2.2.04.02" + }, + "Rodados Valores Originales": { + "account_number": "1.2.2.04.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.04.00" + }, + "TERRENOS": { + "Terrenos Actualizaciones": { + "account_number": "1.2.2.07.02" + }, + "Terrenos Valores Originales": { + "account_number": "1.2.2.07.01", + "account_type": "Fixed Asset" + }, + "account_number": "1.2.2.07.00" + }, + "account_number": "1.2.2.00.00" + }, + "CRE\u0301DITOS POR VENTA DE SERVICIOS": { + "DEUDORES NO CORRIENTES": { + "Deudores Locales (No Ctes.)": { + "account_number": "1.2.4.01.01" + }, + "account_number": "1.2.4.01.00" + }, + "Documentos a cobrar por Vtas. de Servicios": { + "account_number": "1.2.4.02.00" + }, + "account_number": "1.2.4.00.00" + }, + "INVERSIONES PERMANENTES": { + "BONOS DE DEUDA": { + "Bonex": { + "account_number": "1.2.1.01.02" + }, + "Ti\u0301tulos Deuda Pu\u0301blica (Pesos)": { + "account_number": "1.2.1.01.01", "is_group": 1 }, - "1.2.1.01.02 - Bonex": {} + "account_number": "1.2.1.01.00" }, - "1.2.1.02.00 - DEPO\u0301SITOS A PLAZO FIJO NO": { - "1.2.1.02.01 - Depo\u0301sitos a plazo fijo en pesos (no cte.)": {}, - "1.2.1.02.02 - Depo\u0301sitos a plazo fijo en moneda": {} + "DEPO\u0301SITOS A PLAZO FIJO NO": { + "Depo\u0301sitos a plazo fijo en moneda": { + "account_number": "1.2.1.02.02" + }, + "Depo\u0301sitos a plazo fijo en pesos (no cte.)": { + "account_number": "1.2.1.02.01" + }, + "account_number": "1.2.1.02.00" }, - "1.2.1.03.00 - INVERSIONES EN BIENES DEPRECIABLES": { - "1.2.1.03.01 - Inversiones en Inmuebles Valores": {}, - "1.2.1.03.02 - Inversiones en Inmuebles": {}, - "1.2.1.03.03 - Amortizaciones Acumuladas Inversiones": {} - } + "INVERSIONES EN BIENES DEPRECIABLES": { + "Amortizaciones Acumuladas Inversiones": { + "account_number": "1.2.1.03.03" + }, + "Inversiones en Inmuebles": { + "account_number": "1.2.1.03.02" + }, + "Inversiones en Inmuebles Valores": { + "account_number": "1.2.1.03.01" + }, + "account_number": "1.2.1.03.00" + }, + "account_number": "1.2.1.00.00" }, - "1.2.2.00.00 - BIENES DE USO": { - "1.2.2.01.00 - INMUEBLES": { - "1.2.2.01.01 - Inmuebles Valores originales": { - "account_type": "Fixed Asset" - }, - "1.2.2.01.02 - Inmuebles Actualizaciones": {}, - "1.2.2.01.03 - Amortizaciones Acumuladas Inmuebles": { - "account_type": "Depreciation" - } + "OTROS ACTIVOS NO CORRIENTES": { + "Llave de Negocio": { + "account_number": "1.2.6.01.00" }, - "1.2.2.02.00 - MAQUINARIAS Y EQUIPOS": { - "1.2.2.02.01 - Maquinarias y Equipos Valores de origen": { - "account_type": "Fixed Asset" - }, - "1.2.2.02.02 - Maquinarias y Equipos Actualizaciones": {}, - "1.2.2.02.03 - Amortizaciones Acumuladas Maquinarias": { - "account_type": "Depreciation" - } - }, - "1.2.2.03.00 - MUEBLES Y U\u0301TILES": { - "1.2.2.03.01 - Muebles y U\u0301tiles Valores de Origen": { - "account_type": "Fixed Asset" - }, - "1.2.2.03.02 - Muebles y U\u0301tiles Actualizaciones": {}, - "1.2.2.03.03 - Amortizaciones Acumuladas Muebles y": { - "account_type": "Depreciation" - } - }, - "1.2.2.04.00 - RODADOS": { - "1.2.2.04.01 - Rodados Valores Originales": { - "account_type": "Fixed Asset" - }, - "1.2.2.04.02 - Rodados Actualizaciones": {}, - "1.2.2.04.03 - Amortizaciones Acumuladas Rodados": { - "account_type": "Depreciation" - } - }, - "1.2.2.07.00 - TERRENOS": { - "1.2.2.07.01 - Terrenos Valores Originales": { - "account_type": "Fixed Asset" - }, - "1.2.2.07.02 - Terrenos Actualizaciones": {} - }, - "1.2.2.08.00 - INSTALACIONES": { - "1.2.2.08.01 - Instalaciones Valores Originales": { - "account_type": "Fixed Asset" - }, - "1.2.2.08.02 - Instalaciones Ajuste": {}, - "1.2.2.08.03 - Amortizaciones Acumuladas": { - "account_type": "Depreciation" - } - }, - "1.2.2.09.00 - HERRAMIENTAS": { - "1.2.2.09.01 - Herramientas Valores Originales": { - "account_type": "Fixed Asset" - }, - "1.2.2.09.02 - Herramientas Ajuste": {}, - "1.2.2.09.03 - Amortizaciones Acumuladas": { - "account_type": "Depreciation" - } - } + "account_number": "1.2.6.00.00" }, - "1.2.3.00.00 - ACTIVOS INTANGIBLES": { - "1.2.3.01.00 - MARCAS Y PATENTES": { - "1.2.3.01.01 - Marcas y Patentes Valores Originales": {}, - "1.2.3.01.02 - Marcas y Patentes Actualizaciones": {}, - "1.2.3.01.03 - Amortizaciones Acumuladas Marcas y": {} - } - }, - "1.2.4.00.00 - CRE\u0301DITOS POR VENTA DE SERVICIOS": { - "1.2.4.01.00 - DEUDORES NO CORRIENTES": { - "1.2.4.01.01 - Deudores Locales (No Ctes.)": {} + "OTROS CRE\u0301DITOS NO CORRIENTES": { + "CRE\u0301DITOS DIVERSOS NO CORRIENTES": { + "Cuentas Particulares Directores (No": { + "account_number": "1.2.5.02.01" + }, + "Cuentas Particulares Socios/Accionistas": { + "account_number": "1.2.5.02.02" + }, + "account_number": "1.2.5.02.00" }, - "1.2.4.02.00 - Documentos a cobrar por Vtas. de Servicios": {} - }, - "1.2.5.00.00 - OTROS CRE\u0301DITOS NO CORRIENTES": { - "1.2.5.01.00 - CRE\u0301DITOS IMPOSITIVOS NO CORRIENTES": { - "1.2.5.01.01 - Activos por Impto. Diferido (No Ctes.)": {}, - "1.2.5.01.02 - Cre\u0301ditos por Quebrantos Impositivos no": {} + "CRE\u0301DITOS IMPOSITIVOS NO CORRIENTES": { + "Activos por Impto. Diferido (No Ctes.)": { + "account_number": "1.2.5.01.01" + }, + "Cre\u0301ditos por Quebrantos Impositivos no": { + "account_number": "1.2.5.01.02" + }, + "account_number": "1.2.5.01.00" }, - "1.2.5.02.00 - CRE\u0301DITOS DIVERSOS NO CORRIENTES": { - "1.2.5.02.01 - Cuentas Particulares Directores (No": {}, - "1.2.5.02.02 - Cuentas Particulares Socios/Accionistas": {} - } + "account_number": "1.2.5.00.00" }, - "1.2.6.00.00 - OTROS ACTIVOS NO CORRIENTES": { - "1.2.6.01.00 - Llave de Negocio": {} - } + "account_number": "1.2.0.00.00" }, + "account_number": "1.0.0.00.00", "root_type": "Asset" }, - "2.0.0.00.00 - PASIVO": { - "2.1.0.00.00 - PASIVO CORRIENTE": { - "2.1.1.00.00 - DEUDAS COMERCIALES CORRIENTES": { - "2.1.1.02.00 - ACREEDORES": { - "2.1.1.02.01 - Acreedores Locales (Ctes.)": { - "account_type": "Payable" - } - } + "EGRESOS": { + "EGRESOS EXTRAORDINARIOS": { + "Ajuste de Amortizaciones acumuladas de": { + "account_number": "5.2.4.00.00" }, - "2.1.2.00.00 - REMUNERACIONES Y CAGAS SOCIALES": { - "2.1.2.02.00 - DEUDAS PREVISIONALES": { - "2.1.2.02.01 - Jubilaciones a pagar": {}, - "2.1.2.02.02 - ART a pagar": {}, - "2.1.2.02.03 - Obra Social a pagar": {}, - "2.1.2.02.04 - SAC a pagar": {}, - "2.1.2.02.05 - Vacaciones a pagar": {} - }, - "2.1.2.03.00 - Sueldos y Jornales a pagar": { - "account_type": "Chargeable" - } + "Ajuste del valor de los bienes": { + "account_number": "5.2.3.00.00" }, - "2.1.3.00.00 - CARGAS FISCALES": { - "2.1.3.01.00 - IMPUESTO AL VALOR AGREGADO": { - "2.1.3.01.01 - IVA De\u0301bito Fiscal": {}, - "2.1.3.01.02 - IVA De\u0301bito Fiscal Sobretasa": {}, - "2.1.3.01.03 - Percepciones y Retenciones efectuadas": {}, - "2.1.3.01.04 - IVA a Pagar": {} - }, - "2.1.3.02.00 - INGRESOS BRUTOS": { - "2.1.3.02.01 - Impuesto a los Ingresos Brutos a Pagar": {}, - "2.1.3.02.02 - Percepciones efectuadas Ingresos": {} - }, - "2.1.3.03.00 - IMPUESTO A LAS GANANCIAS": { - "2.1.3.03.01 - Impuesto Ganancia Mi\u0301nima Presunta a": {}, - "2.1.3.03.02 - Impuesto a las Ganancias a Pagar": {}, - "2.1.3.03.03 - Pasivo por Impuesto Diferido": {}, - "2.1.3.03.04 - Percepciones y Retenciones efectuadas": {} - } + "Amortizaciones extraordinarias": { + "account_number": "5.2.2.00.00" }, - "2.1.4.00.00 - DEUDAS FINANCIERAS": { - "2.1.4.01.00 - Pre\u0301stamo Banco de la Nacio\u0301n Argentina (Cte.)": {}, - "2.1.4.02.00 - Pre\u0301stamo Banco de la Provincia de Bs. As.": {} + "Pe\u0301rdida por venta bienes de uso": { + "account_number": "5.2.1.00.00" }, - "2.1.5.00.00 - OTRAS DEUDAS CORRIENTES": { - "2.1.5.01.00 - Dividendos a pagar (Ctes.)": {}, - "2.1.5.02.00 - Honorarios Directores a Pagar (Ctes.)": {} - }, - "2.1.6.00.00 - PROVISIONES": { - "2.1.6.01.00 - Provisio\u0301n para despidos": {}, - "2.1.6.02.00 - Provisio\u0301n para SAC": {} - }, - "2.1.7.00.00 - INVENTARIOS POR PAGAR": { - "2.1.7.01.00 - Inventario entrante no facturado": { - "account_type": "Stock Received But Not Billed" - } - } + "account_number": "5.2.0.00.00" }, - "2.2.0.00.00 - PASIVO NO CORRIENTE": { - "2.2.1.00.00 - DEUDAS FINANCIERAS NO CORRIENTES": { - "2.2.1.01.00 - Pre\u0301stamo Banco de la Nacio\u0301n Argentina(ejemplo) (No": {} + "EGRESOS ORDINARIOS": { + "GASTOS DE ADMINISTRACIO\u0301N": { + "Amortizaciones - Administracio\u0301n": { + "account_number": "5.1.3.04.00" + }, + "Cargas Sociales - Administracio\u0301n": { + "account_number": "5.1.3.02.00" + }, + "Certificaciones y Sellados": { + "account_number": "5.1.3.07.00" + }, + "Correspondencia - Administracio\u0301n": { + "account_number": "5.1.3.11.00" + }, + "Costo sobre ventas": { + "account_number": "5.1.3.15.00", + "account_type": "Cost of Goods Sold" + }, + "Energi\u0301a - Administracio\u0301n": { + "account_number": "5.1.3.13.00" + }, + "Gastos Bancarios - Administracio\u0301n": { + "account_number": "5.1.3.08.00" + }, + "Gastos Varios - Administracio\u0301n": { + "account_number": "5.1.3.09.00" + }, + "Gastos de Valoracion": { + "account_number": "5.1.3.16.00", + "account_type": "Expenses Included In Valuation" + }, + "Honorarios - Administracio\u0301n": { + "account_number": "5.1.3.03.00" + }, + "Insumos Computacio\u0301n - Administracio\u0301n": { + "account_number": "5.1.3.10.00" + }, + "Libreri\u0301a y Papeleri\u0301a - Administracio\u0301n": { + "account_number": "5.1.3.06.00" + }, + "Mantenimiento - Administracio\u0301n": { + "account_number": "5.1.3.12.00" + }, + "Seguros - Administracio\u0301n": { + "account_number": "5.1.3.14.00" + }, + "Sueldos - Administracio\u0301n": { + "account_number": "5.1.3.01.00" + }, + "Via\u0301ticos - Administracio\u0301n": { + "account_number": "5.1.3.05.00" + }, + "account_number": "5.1.3.00.00" }, - "2.2.2.00.00 - CARGAS FISCALES NO CORRIENTES": { - "2.2.2.01.00 - Moratoria": {} + "GASTOS DE COMERCIALIZACIO\u0301N": { + "Amortizaciones - Comercializacio\u0301n": { + "account_number": "5.1.4.04.00" + }, + "Cargas Sociales - Comercializacio\u0301n": { + "account_number": "5.1.4.02.00" + }, + "Comisiones de terceros": { + "account_number": "5.1.4.11.00" + }, + "Descuentos otorgados a clientes": { + "account_number": "5.1.4.10.00" + }, + "Fletes - Comercializacio\u0301n": { + "account_number": "5.1.4.08.00" + }, + "Gastos Varios - Comercializacio\u0301n": { + "account_number": "5.1.4.07.00" + }, + "Honorarios - Comercializacio\u0301n": { + "account_number": "5.1.4.06.00" + }, + "IVA no computable - Comercializacio\u0301n": { + "account_number": "5.1.4.09.00" + }, + "Publicidad - Comercializacio\u0301n": { + "account_number": "5.1.4.03.00" + }, + "Quebrantos por deudores": { + "account_number": "5.1.4.12.00" + }, + "Seguros - Comercializacio\u0301n": { + "account_number": "5.1.4.05.00" + }, + "Sueldos - Comercializacio\u0301n": { + "account_number": "5.1.4.01.00" + }, + "Via\u0301ticos - Comercializacio\u0301n": { + "account_number": "5.1.4.13.00" + }, + "account_number": "5.1.4.00.00" }, - "2.2.3.00.00 - DEUDAS COMERCIALES": { - "2.2.3.01.00 - ACREEDORES": { - "2.2.3.01.01 - Acreedores Locales (No Ctes.)": {} - } + "GASTOS DE EXPLOTACIO\u0301N": { + "Amortizaciones - Explotacio\u0301n": { + "account_number": "5.1.2.10.00" + }, + "Cargas Sociales - Explotacio\u0301n": { + "account_number": "5.1.2.02.00" + }, + "Combustibles y Lubricantes - Explotacio\u0301n": { + "account_number": "5.1.2.14.00" + }, + "Comida del personal - Explotacio\u0301n": { + "account_number": "5.1.2.08.00" + }, + "Cuota me\u0301dica a cargo del empleador": { + "account_number": "5.1.2.09.00" + }, + "Despidos - Explotacio\u0301n": { + "account_number": "5.1.2.07.00" + }, + "Energi\u0301a - Explotacio\u0301n": { + "account_number": "5.1.2.03.00" + }, + "Fletes - Explotacio\u0301n": { + "account_number": "5.1.2.16.00" + }, + "Gastos de limpieza - Explotacio\u0301n": { + "account_number": "5.1.2.12.00" + }, + "Honorarios Profesionales - Explotacio\u0301n": { + "account_number": "5.1.2.04.00" + }, + "Insumos diversos - Explotacio\u0301n": { + "account_number": "5.1.2.15.00" + }, + "Mantenimiento - Explotacio\u0301n": { + "account_number": "5.1.2.13.00" + }, + "Repuestos y Reparaciones - Explotacio\u0301n": { + "account_number": "5.1.2.11.00" + }, + "Ropa de trabajo - Explotacio\u0301n": { + "account_number": "5.1.2.05.00" + }, + "Seguros - Explotacio\u0301n": { + "account_number": "5.1.2.06.00" + }, + "Sueldos y Jornales - Explotacio\u0301n": { + "account_number": "5.1.2.01.00" + }, + "account_number": "5.1.2.00.00" }, - "2.2.4.00.00 - OTRAS DEUDAS NO CORRIENTES": { - "is_group": 1 - } + "GASTOS FINANCIEROS": { + "Amortizaciones Inversiones en bienes": { + "account_number": "5.1.5.08.00" + }, + "Diferencia de Cambio": { + "account_number": "5.1.5.04.00" + }, + "Diferencia de Cambio Balance en": { + "account_number": "5.1.5.05.00" + }, + "Intereses a Proveedores": { + "account_number": "5.1.5.02.00" + }, + "Intereses y Gastos bancarios": { + "account_number": "5.1.5.01.00" + }, + "Intereses y recargos impositivos": { + "account_number": "5.1.5.03.00" + }, + "R.E.C.P.A.M": { + "account_number": "5.1.5.09.00" + }, + "Resultado por tenencia (negativo)": { + "account_number": "5.1.5.06.00" + }, + "Resultado por tenencia negativo de": { + "account_number": "5.1.5.10.00" + }, + "account_number": "5.1.5.00.00" + }, + "GASTOS SOBRE EXISTENCIAS": { + "Ajuste de Existencia": { + "account_number": "5.1.8.03.00", + "account_type": "Stock Adjustment" + }, + "Costo sobre ventas": { + "account_number": "5.1.8.01.00", + "account_type": "Cost of Goods Sold" + }, + "Gastos de Valoracion": { + "account_number": "5.1.8.02.00", + "account_type": "Expenses Included In Valuation" + }, + "account_number": "5.1.8.00.00" + }, + "IMPUESTOS": { + "Impuesto a las Ganancia Mi\u0301nima": { + "account_number": "5.1.7.02.00" + }, + "Impuesto a las Ganancias": { + "account_number": "5.1.7.01.00" + }, + "Impuesto a los Ingresos Brutos": { + "account_number": "5.1.7.03.00" + }, + "Impuesto s/ los De\u0301bitos y Cre\u0301ditos": { + "account_number": "5.1.7.06.00" + }, + "Impuestos Territoriales": { + "account_number": "5.1.7.05.00" + }, + "Impuestos internos y varios": { + "account_number": "5.1.7.07.00" + }, + "Tasa municipal": { + "account_number": "5.1.7.04.00" + }, + "account_number": "5.1.7.00.00" + }, + "account_number": "5.1.0.00.00" }, - "root_type": "Liability" + "account_number": "5.0.0.00.00", + "root_type": "Expense" }, - "3.0.0.00.00 - PATRIMONIO NETO": { - "3.1.0.00.00 - APORTE DE LOS PROPIETARIOS": { - "3.1.1.00.00 - CAPITAL SOCIAL": { - "3.1.1.01.00 - Acciones en Circulacio\u0301n": {}, - "3.1.1.02.00 - Aportes Irrevocables": {}, - "3.1.1.03.00 - Acciones a distribuir": {}, - "3.1.1.04.00 - Capital": {}, - "3.1.1.05.00 - Ajuste del Capital": {} - } - }, - "3.3.0.00.00 - RESERVAS": { - "3.3.1.00.00 - Reserva Legal": {}, - "3.3.2.00.00 - Reserva Facultativa": {}, - "3.3.3.00.00 - Reserva Estatutaria": {}, - "3.3.4.00.00 - Ajuste Reserva Legal": {} - }, - "3.4.0.00.00 - RESULTADOS ACUMULADOS": { - "3.4.1.00.00 - Resultado del Ejercicio": {}, - "3.4.2.00.00 - Resultado Ejercicios Anteriores": {}, - "3.4.3.00.00 - A.R.E.A (P)": {}, - "3.4.4.00.00 - A.R.E.A (G)": {} - }, - "root_type": "Equity" - }, - "4.1.0.00.00 - INGRESOS": { - "4.1.0.00.00 - INGRESOS ORDINARIOS": { - "4.1.1.00.00 - INGRESOS POR SERVICIOS PRESTADOS": { - "4.1.1.01.00 - Ventas de Servicios": {}, - "4.1.1.02.00 - Ingresos de fuente extranjera": {} + "INGRESOS": { + "INGRESOS EXTRAORDINARIOS": { + "Otros ingresos extraordinarios": { + "account_number": "4.2.3.00.00" }, - "4.1.3.00.00 - RESULTADOS FINANCIEROS Y POR": { - "4.1.3.01.00 - Intereses Ganados": {}, - "4.1.3.02.00 - Resultado por Tenencia de acciones": {}, - "4.1.3.03.00 - Diferencia tipo de cambio": {}, - "4.1.3.04.00 - Resultado por tenencia (positivo)": {} + "Reintegro de Seguros": { + "account_number": "4.2.2.00.00" }, - "4.1.4.00.00 - OTROS INGRESOS ORDINARIOS": { + "Utilidad Venta Bienes de Uso": { + "account_number": "4.2.1.00.00" + }, + "account_number": "4.2.0.00.00" + }, + "INGRESOS ORDINARIOS": { + "INGRESOS POR SERVICIOS PRESTADOS": { + "Ingresos de fuente extranjera": { + "account_number": "4.1.1.02.00" + }, + "Ventas de Servicios": { + "account_number": "4.1.1.01.00" + }, + "account_number": "4.1.1.00.00" + }, + "OTROS INGRESOS ORDINARIOS": { + "account_number": "4.1.4.00.00", "is_group": 1 - } - }, - "4.2.0.00.00 - INGRESOS EXTRAORDINARIOS": { - "4.2.1.00.00 - Utilidad Venta Bienes de Uso": {}, - "4.2.2.00.00 - Reintegro de Seguros": {}, - "4.2.3.00.00 - Otros ingresos extraordinarios": {} + }, + "RESULTADOS FINANCIEROS Y POR": { + "Diferencia tipo de cambio": { + "account_number": "4.1.3.03.00" + }, + "Intereses Ganados": { + "account_number": "4.1.3.01.00" + }, + "Resultado por Tenencia de acciones": { + "account_number": "4.1.3.02.00" + }, + "Resultado por tenencia (positivo)": { + "account_number": "4.1.3.04.00" + }, + "account_number": "4.1.3.00.00" + }, + "account_number": "4.1.0.00.00" }, + "account_number": "4.0.0.00.00", "root_type": "Income" }, - "5.0.0.00.00 - EGRESOS": { - "5.1.0.00.00 - EGRESOS ORDINARIOS": { - "5.1.2.00.00 - GASTOS DE EXPLOTACIO\u0301N": { - "5.1.2.01.00 - Sueldos y Jornales - Explotacio\u0301n": {}, - "5.1.2.02.00 - Cargas Sociales - Explotacio\u0301n": {}, - "5.1.2.03.00 - Energi\u0301a - Explotacio\u0301n": {}, - "5.1.2.04.00 - Honorarios Profesionales - Explotacio\u0301n": {}, - "5.1.2.05.00 - Ropa de trabajo - Explotacio\u0301n": {}, - "5.1.2.06.00 - Seguros - Explotacio\u0301n": {}, - "5.1.2.07.00 - Despidos - Explotacio\u0301n": {}, - "5.1.2.08.00 - Comida del personal - Explotacio\u0301n": {}, - "5.1.2.09.00 - Cuota me\u0301dica a cargo del empleador": {}, - "5.1.2.10.00 - Amortizaciones - Explotacio\u0301n": {}, - "5.1.2.11.00 - Repuestos y Reparaciones - Explotacio\u0301n": {}, - "5.1.2.12.00 - Gastos de limpieza - Explotacio\u0301n": {}, - "5.1.2.13.00 - Mantenimiento - Explotacio\u0301n": {}, - "5.1.2.14.00 - Combustibles y Lubricantes - Explotacio\u0301n": {}, - "5.1.2.15.00 - Insumos diversos - Explotacio\u0301n": {}, - "5.1.2.16.00 - Fletes - Explotacio\u0301n": {} - }, - "5.1.3.00.00 - GASTOS DE ADMINISTRACIO\u0301N": { - "5.1.3.01.00 - Sueldos - Administracio\u0301n": {}, - "5.1.3.02.00 - Cargas Sociales - Administracio\u0301n": {}, - "5.1.3.03.00 - Honorarios - Administracio\u0301n": {}, - "5.1.3.04.00 - Amortizaciones - Administracio\u0301n": {}, - "5.1.3.05.00 - Via\u0301ticos - Administracio\u0301n": {}, - "5.1.3.06.00 - Libreri\u0301a y Papeleri\u0301a - Administracio\u0301n": {}, - "5.1.3.07.00 - Certificaciones y Sellados": {}, - "5.1.3.08.00 - Gastos Bancarios - Administracio\u0301n": {}, - "5.1.3.09.00 - Gastos Varios - Administracio\u0301n": {}, - "5.1.3.10.00 - Insumos Computacio\u0301n - Administracio\u0301n": {}, - "5.1.3.11.00 - Correspondencia - Administracio\u0301n": {}, - "5.1.3.12.00 - Mantenimiento - Administracio\u0301n": {}, - "5.1.3.13.00 - Energi\u0301a - Administracio\u0301n": {}, - "5.1.3.14.00 - Seguros - Administracio\u0301n": {}, - "5.1.3.15.00 - Costo sobre ventas": { - "account_type": "Cost of Goods Sold" + "PASIVO": { + "PASIVO CORRIENTE": { + "CARGAS FISCALES": { + "IMPUESTO A LAS GANANCIAS": { + "Impuesto Ganancia Mi\u0301nima Presunta a": { + "account_number": "2.1.3.03.01" + }, + "Impuesto a las Ganancias a Pagar": { + "account_number": "2.1.3.03.02" + }, + "Pasivo por Impuesto Diferido": { + "account_number": "2.1.3.03.03" + }, + "Percepciones y Retenciones efectuadas": { + "account_number": "2.1.3.03.04" + }, + "account_number": "2.1.3.03.00" }, - "5.1.3.16.00 - Gastos de Valoracion": { - "account_type": "Expenses Included In Valuation" - } - }, - "5.1.4.00.00 - GASTOS DE COMERCIALIZACIO\u0301N": { - "5.1.4.01.00 - Sueldos - Comercializacio\u0301n": {}, - "5.1.4.02.00 - Cargas Sociales - Comercializacio\u0301n": {}, - "5.1.4.03.00 - Publicidad - Comercializacio\u0301n": {}, - "5.1.4.04.00 - Amortizaciones - Comercializacio\u0301n": {}, - "5.1.4.05.00 - Seguros - Comercializacio\u0301n": {}, - "5.1.4.06.00 - Honorarios - Comercializacio\u0301n": {}, - "5.1.4.07.00 - Gastos Varios - Comercializacio\u0301n": {}, - "5.1.4.08.00 - Fletes - Comercializacio\u0301n": {}, - "5.1.4.09.00 - IVA no computable - Comercializacio\u0301n": {}, - "5.1.4.10.00 - Descuentos otorgados a clientes": {}, - "5.1.4.11.00 - Comisiones de terceros": {}, - "5.1.4.12.00 - Quebrantos por deudores": {}, - "5.1.4.13.00 - Via\u0301ticos - Comercializacio\u0301n": {} - }, - "5.1.5.00.00 - GASTOS FINANCIEROS": { - "5.1.5.01.00 - Intereses y Gastos bancarios": {}, - "5.1.5.02.00 - Intereses a Proveedores": {}, - "5.1.5.03.00 - Intereses y recargos impositivos": {}, - "5.1.5.04.00 - Diferencia de Cambio": {}, - "5.1.5.05.00 - Diferencia de Cambio Balance en": {}, - "5.1.5.06.00 - Resultado por tenencia (negativo)": {}, - "5.1.5.08.00 - Amortizaciones Inversiones en bienes": {}, - "5.1.5.09.00 - R.E.C.P.A.M": {}, - "5.1.5.10.00 - Resultado por tenencia negativo de": {} - }, - "5.1.7.00.00 - IMPUESTOS": { - "5.1.7.01.00 - Impuesto a las Ganancias": {}, - "5.1.7.02.00 - Impuesto a las Ganancia Mi\u0301nima": {}, - "5.1.7.03.00 - Impuesto a los Ingresos Brutos": {}, - "5.1.7.04.00 - Tasa municipal": {}, - "5.1.7.05.00 - Impuestos Territoriales": {}, - "5.1.7.06.00 - Impuesto s/ los De\u0301bitos y Cre\u0301ditos": {}, - "5.1.7.07.00 - Impuestos internos y varios": {} - }, - "5.1.8.00.00 - GASTOS SOBRE EXISTENCIAS": { - "5.1.8.01.00 - Costo sobre ventas": { - "account_type": "Cost of Goods Sold" + "IMPUESTO AL VALOR AGREGADO": { + "IVA De\u0301bito Fiscal": { + "account_number": "2.1.3.01.01" + }, + "IVA De\u0301bito Fiscal Sobretasa": { + "account_number": "2.1.3.01.02" + }, + "IVA a Pagar": { + "account_number": "2.1.3.01.04" + }, + "Percepciones y Retenciones efectuadas": { + "account_number": "2.1.3.01.03" + }, + "account_number": "2.1.3.01.00" }, - "5.1.8.02.00 - Gastos de Valoracion": { - "account_type": "Expenses Included In Valuation" + "INGRESOS BRUTOS": { + "Impuesto a los Ingresos Brutos a Pagar": { + "account_number": "2.1.3.02.01" + }, + "Percepciones efectuadas Ingresos": { + "account_number": "2.1.3.02.02" + }, + "account_number": "2.1.3.02.00" }, - "5.1.8.03.00 - Ajuste de Existencia": { - "account_type": "Stock Adjustment" - } - } + "account_number": "2.1.3.00.00" + }, + "DEUDAS COMERCIALES CORRIENTES": { + "ACREEDORES": { + "Acreedores Locales (Ctes.)": { + "account_number": "2.1.1.02.01", + "account_type": "Payable" + }, + "account_number": "2.1.1.02.00" + }, + "account_number": "2.1.1.00.00" + }, + "DEUDAS FINANCIERAS": { + "Pre\u0301stamo Banco de la Nacio\u0301n Argentina (Cte.)": { + "account_number": "2.1.4.01.00" + }, + "Pre\u0301stamo Banco de la Provincia de Bs. As.": { + "account_number": "2.1.4.02.00" + }, + "account_number": "2.1.4.00.00" + }, + "INVENTARIOS POR PAGAR": { + "Inventario entrante no facturado": { + "account_number": "2.1.7.01.00", + "account_type": "Stock Received But Not Billed" + }, + "account_number": "2.1.7.00.00" + }, + "OTRAS DEUDAS CORRIENTES": { + "Dividendos a pagar (Ctes.)": { + "account_number": "2.1.5.01.00" + }, + "Honorarios Directores a Pagar (Ctes.)": { + "account_number": "2.1.5.02.00" + }, + "account_number": "2.1.5.00.00" + }, + "PROVISIONES": { + "Provisio\u0301n para SAC": { + "account_number": "2.1.6.02.00" + }, + "Provisio\u0301n para despidos": { + "account_number": "2.1.6.01.00" + }, + "account_number": "2.1.6.00.00" + }, + "REMUNERACIONES Y CAGAS SOCIALES": { + "DEUDAS PREVISIONALES": { + "ART a pagar": { + "account_number": "2.1.2.02.02" + }, + "Jubilaciones a pagar": { + "account_number": "2.1.2.02.01" + }, + "Obra Social a pagar": { + "account_number": "2.1.2.02.03" + }, + "SAC a pagar": { + "account_number": "2.1.2.02.04" + }, + "Vacaciones a pagar": { + "account_number": "2.1.2.02.05" + }, + "account_number": "2.1.2.02.00" + }, + "Sueldos y Jornales a pagar": { + "account_number": "2.1.2.03.00", + "account_type": "Chargeable" + }, + "account_number": "2.1.2.00.00" + }, + "account_number": "2.1.0.00.00" }, - "5.2.0.00.00 - EGRESOS EXTRAORDINARIOS": { - "5.2.1.00.00 - Pe\u0301rdida por venta bienes de uso": {}, - "5.2.2.00.00 - Amortizaciones extraordinarias": {}, - "5.2.3.00.00 - Ajuste del valor de los bienes": {}, - "5.2.4.00.00 - Ajuste de Amortizaciones acumuladas de": {} + "PASIVO NO CORRIENTE": { + "CARGAS FISCALES NO CORRIENTES": { + "Moratoria": { + "account_number": "2.2.2.01.00" + }, + "account_number": "2.2.2.00.00" + }, + "DEUDAS COMERCIALES": { + "ACREEDORES": { + "Acreedores Locales (No Ctes.)": { + "account_number": "2.2.3.01.01" + }, + "account_number": "2.2.3.01.00" + }, + "account_number": "2.2.3.00.00" + }, + "DEUDAS FINANCIERAS NO CORRIENTES": { + "Pre\u0301stamo Banco de la Nacio\u0301n Argentina(ejemplo) (No": { + "account_number": "2.2.1.01.00" + }, + "account_number": "2.2.1.00.00" + }, + "OTRAS DEUDAS NO CORRIENTES": { + "account_number": "2.2.4.00.00", + "is_group": 1 + }, + "account_number": "2.2.0.00.00" }, - "root_type": "Expense" + "account_number": "2.0.0.00.00", + "root_type": "Liability" + }, + "PATRIMONIO NETO": { + "APORTE DE LOS PROPIETARIOS": { + "CAPITAL SOCIAL": { + "Acciones a distribuir": { + "account_number": "3.1.1.03.00" + }, + "Acciones en Circulacio\u0301n": { + "account_number": "3.1.1.01.00" + }, + "Ajuste del Capital": { + "account_number": "3.1.1.05.00" + }, + "Aportes Irrevocables": { + "account_number": "3.1.1.02.00" + }, + "Capital": { + "account_number": "3.1.1.04.00" + }, + "account_number": "3.1.1.00.00" + }, + "account_number": "3.1.0.00.00" + }, + "RESERVAS": { + "Ajuste Reserva Legal": { + "account_number": "3.3.4.00.00" + }, + "Reserva Estatutaria": { + "account_number": "3.3.3.00.00" + }, + "Reserva Facultativa": { + "account_number": "3.3.2.00.00" + }, + "Reserva Legal": { + "account_number": "3.3.1.00.00" + }, + "account_number": "3.3.0.00.00" + }, + "RESULTADOS ACUMULADOS": { + "A.R.E.A (G)": { + "account_number": "3.4.4.00.00" + }, + "A.R.E.A (P)": { + "account_number": "3.4.3.00.00" + }, + "Resultado Ejercicios Anteriores": { + "account_number": "3.4.2.00.00" + }, + "Resultado del Ejercicio": { + "account_number": "3.4.1.00.00" + }, + "account_number": "3.4.0.00.00" + }, + "account_number": "3.0.0.00.00", + "root_type": "Equity" } } } \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json index 018d368de44..da1d10deb97 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json @@ -1,6 +1,6 @@ { "country_code": "fr", - "name": "France - Plan Comptable G\u00e9n\u00e9ral", + "name": "France - Plan Comptable General", "tree": { "1-Comptes de Capitaux": { "10-Capital et R\u00e9serves": { diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/gt_cuentas_plantilla.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/gt_cuentas_plantilla.json index f7cf9a0bb84..0434938d6b9 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/gt_cuentas_plantilla.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/gt_cuentas_plantilla.json @@ -2,7 +2,394 @@ "country_code": "gt", "name": "Guatemala - Cuentas", "tree": { - "02 - Pasivos": { + "Activos": { + "Activo Corriente": { + "Activos Biol\u00f3gicos": { + "Activos Biol\u00f3gicos a Valor Razonable": { + "Animales": { + "account_number": "1.5.2.1", + "account_type": "Stock", + "is_group": 1 + }, + "Plantas": { + "account_number": "1.5.2.2", + "account_type": "Stock", + "is_group": 1 + }, + "account_number": "1.5.2", + "account_type": "Stock" + }, + "Activos Biol\u00f3gicos al Costo": { + "account_number": "1.5.1", + "account_type": "Stock", + "is_group": 1 + }, + "account_number": "1.5", + "account_type": "Stock" + }, + "Activos Corrientes Adicionales": { + "Activos Diferidos o Restringidos": { + "Cr\u00e9dito Fiscal (IVA Por Cobrar)": { + "account_number": "1.1.2.1", + "account_type": "Chargeable", + "is_group": 1 + }, + "account_number": "1.1.2", + "account_type": "Chargeable" + }, + "Inversiones Corrientes no Clasificados como Equivalentes de Caja y Bancos": { + "account_number": "1.1.1" + }, + "account_number": "1.1", + "account_type": "Chargeable" + }, + "Activos Devengables y Otros Activos": { + "Activos Adicionales y Otros": { + "account_number": "1.6.6", + "account_type": "Chargeable", + "is_group": 1 + }, + "Cobrables Relacionados con Impuestos": { + "account_number": "1.6.2", + "account_type": "Chargeable", + "is_group": 1 + }, + "Contratos de Construccion": { + "account_number": "1.6.4", + "account_type": "Chargeable", + "is_group": 1 + }, + "Costos de Montaje": { + "account_number": "1.6.5", + "account_type": "Chargeable", + "is_group": 1 + }, + "Pagos Anticipados y Otros Activos Circulantes": { + "Seguro Pagado Anticipadamente": { + "account_number": "1.6.1.0", + "account_type": "Chargeable" + }, + "account_number": "1.6.1", + "account_type": "Chargeable" + }, + "Proveedores de Servicio": { + "account_number": "1.6.3", + "account_type": "Chargeable", + "is_group": 1 + }, + "account_number": "1.6", + "account_type": "Chargeable" + }, + "Activos Financieros": { + "Activos Financieros Clasificados por Designaci\u00f3n": { + "account_number": "1.4.6", + "account_type": "Chargeable", + "is_group": 1 + }, + "Activos Financieros Derivados": { + "account_number": "1.4.3", + "account_type": "Chargeable", + "is_group": 1 + }, + "Inversion o Participaci\u00f3n Accionaria en Empresas Afiliadas": { + "account_number": "1.4.1", + "account_type": "Chargeable", + "is_group": 1 + }, + "Inversiones Burs\u00e1tiles e Instrumentos Financieros": { + "account_number": "1.4.2", + "account_type": "Chargeable", + "is_group": 1 + }, + "Otros Activos Financieros": { + "account_number": "1.4.4", + "account_type": "Chargeable", + "is_group": 1 + }, + "Provisi\u00f3n por Riesgo de Cr\u00e9dito (agregado) (Contra-activo)": { + "account_number": "1.4.5", + "account_type": "Round Off", + "is_group": 1 + }, + "account_number": "1.4", + "account_type": "Chargeable" + }, + "Activos Intangibles": { + "account_number": "1.3", + "account_type": "Chargeable", + "is_group": 1 + }, + "Caja y Equivalentes": { + "Caja": { + "account_number": "1.9.1", + "account_type": "Cash", + "is_group": 1 + }, + "Equivalentes de Efectivo (Bancos)": { + "Bancos Internacionales": { + "HSBC": { + "account_number": "1.9.2.2.1", + "account_type": "Bank" + }, + "account_number": "1.9.2.2", + "account_type": "Bank" + }, + "Bancos Nacionales": { + "Banco Agromercantil de Guatemala": { + "account_number": "1.9.2.1.2", + "account_type": "Bank" + }, + "Banco G&T Continental": { + "account_number": "1.9.2.1.5", + "account_type": "Bank" + }, + "Banco Industrial": { + "account_number": "1.9.2.1.1", + "account_type": "Bank", + "is_group": 1 + }, + "Banco Internacional": { + "account_number": "1.9.2.1.6", + "account_type": "Bank" + }, + "Banco Prom\u00e9rica": { + "account_number": "1.9.2.1.3", + "account_type": "Bank" + }, + "Banco de Am\u00e9rica Central": { + "account_number": "1.9.2.1.4", + "account_type": "Bank" + }, + "Banco de Desarrollo Rural": { + "account_number": "1.9.2.1.7", + "account_type": "Bank" + }, + "Banco de los Trabajadores": { + "account_number": "1.9.2.1.8", + "account_type": "Bank" + }, + "Vivibanco": { + "account_number": "1.9.2.1.9", + "account_type": "Bank" + }, + "account_number": "1.9.2.1", + "account_type": "Bank" + }, + "Cadena de Bloques (Blockchain)": { + "Billetera Bitcoin 1234567890abcdefg": { + "account_number": "1.9.2.3.1", + "account_type": "Cash" + }, + "account_number": "1.9.2.3", + "account_type": "Cash" + }, + "account_number": "1.9.2", + "account_type": "Bank" + }, + "Inversiones a Corto Plazo": { + "account_number": "1.9.3", + "account_type": "Bank", + "is_group": 1 + }, + "Otros Equivalentes de Caja y Bancos": { + "account_number": "1.9.4", + "account_type": "Cash", + "is_group": 1 + }, + "account_number": "1.9", + "account_type": "Bank" + }, + "Cobrables": { + "Activos bajo Contrato": { + "account_number": "1.8.2", + "account_type": "Receivable", + "is_group": 1 + }, + "Ajustes": { + "account_number": "1.8.4", + "account_type": "Chargeable", + "is_group": 1 + }, + "Otras Cuentas por Cobrar": { + "Cuentas Por Cobrar Compa\u00f1\u00edas Afiliadas": { + "Compa\u00f1\u00eda subsidiaria (EJEMPLO)": { + "account_number": "1.8.3.2.1", + "account_type": "Receivable" + }, + "account_number": "1.8.3.2", + "account_type": "Receivable" + }, + "Cuentas por Cobrar a Empleados": { + "Prestamo EJEMPLO": { + "account_number": "1.8.3.3.1", + "account_type": "Receivable" + }, + "account_number": "1.8.3.3", + "account_type": "Receivable" + }, + "Cuentas por Cobrar a Otras Entidades no Afiliadas": { + "Compa\u00f1\u00eda No Afiliada (EJEMPLO)": { + "account_number": "1.8.3.1.1", + "account_type": "Receivable" + }, + "account_number": "1.8.3.1", + "account_type": "Receivable" + }, + "account_number": "1.8.3", + "account_type": "Receivable" + }, + "Ventas al Cr\u00e9dito": { + "account_number": "1.8.1", + "account_type": "Receivable", + "is_group": 1 + }, + "account_number": "1.8", + "account_type": "Receivable" + }, + "Impuestos por Cobrar": { + "Retenciones de IVA recibidas": {} + }, + "Inventario": { + "Art\u00edculos de Inventario Adicionales": { + "account_number": "1.7.8", + "account_type": "Stock", + "is_group": 1 + }, + "Combustibles": { + "account_number": "1.7.5", + "account_type": "Stock", + "is_group": 1 + }, + "Inventarios Pignorados Como Garant\u00eda de Pasivo": { + "account_number": "1.7.10", + "account_type": "Stock", + "is_group": 1 + }, + "Inventarios a Valor Razonable Menos Costos de Venta": { + "account_number": "1.7.11", + "account_type": "Stock", + "is_group": 1 + }, + "Materia Prima": { + "account_number": "1.7.1", + "account_type": "Stock", + "is_group": 1 + }, + "Mercader\u00eda (Mercanc\u00edas)": { + "account_number": "1.7.2", + "account_type": "Stock", + "is_group": 1 + }, + "Otros Inventarios": { + "Merma o Ajuste de Inventario": { + "account_number": "1.7.9.1", + "account_type": "Stock Adjustment", + "is_group": 1 + }, + "account_number": "1.7.9", + "account_type": "Stock" + }, + "Producto Terminado": { + "account_number": "1.7.7", + "account_type": "Stock", + "is_group": 1 + }, + "Repuestos": { + "Respuestos en Transito": { + "account_number": "1.7.4.0", + "account_type": "Stock", + "is_group": 1 + }, + "account_number": "1.7.4", + "account_type": "Stock" + }, + "Suministros de Producci\u00f3n y Consumibles": { + "account_number": "1.7.3", + "account_type": "Stock", + "is_group": 1 + }, + "Trabajo en Progeso": { + "account_number": "1.7.6", + "account_type": "Stock", + "is_group": 1 + }, + "account_number": "1.7", + "account_type": "Stock" + }, + "Inversion en Propiedades": { + "Inversion Inmobiliaria Bajo Construccion": { + "account_number": "1.2.1", + "account_type": "Chargeable" + }, + "Inversion Inmobiliaria Construida": { + "account_number": "1.2.2", + "account_type": "Chargeable", + "is_group": 1 + }, + "account_number": "1.2", + "account_type": "Chargeable" + }, + "account_number": "1.0" + }, + "No Corriente": { + "Activos Fijos": { + "account_type": "Fixed Asset" + }, + "Cargos Diferidos": {} + }, + "account_number": "1", + "root_type": "Asset" + }, + "Costos": { + "Costo de Ventas": { + "account_type": "Cost of Goods Sold" + }, + "Costos Incluidos en la Valuaci\u00f3n": { + "account_type": "Expenses Included In Valuation" + }, + "Merma o Ajuste de Inventario": { + "account_type": "Stock Adjustment" + }, + "account_number": "5", + "root_type": "Expense" + }, + "Gastos": { + "Alquileres": {}, + "Depreciaciones": { + "account_type": "Depreciation" + }, + "Gastos Diversos": {}, + "Gastos de Personal": {}, + "Honorarios Profesionales": {}, + "Mantenimiento": {}, + "Seguros": {}, + "Servicios B\u00e1sicos": {}, + "account_number": "6", + "root_type": "Expense" + }, + "Ingresos": { + "Productos": {}, + "Servicios": {}, + "account_number": "4", + "root_type": "Income" + }, + "Otros Gastos y Productos Financieros": { + "Otros Gastos": { + "Otros Gastos y Productos Financieros 2": { + "Intereses 1": {}, + "Otros Gastos Financieros 1": {} + } + }, + "Otros Ingresos": { + "Otros Gastos y Productos Financieros 1": { + "Intereses": {}, + "Otros Gastos Financieros": {} + } + }, + "account_number": "7", + "root_type": "Expense" + }, + "Pasivos": { "Pasivo Corriente": { "Acreedores 1": { "account_type": "Payable" @@ -22,329 +409,14 @@ "Acreedores": {}, "Provisi\u00f3n para Indemnizaciones": {} }, + "account_number": "2", "root_type": "Liability" }, - "03 - Patrimonio": { + "Patrimonio": { "Capital": {}, "Resultados del Ejercicio": {}, "Utilidades Retenidas": {}, - "root_type": "Asset" - }, - "04 - Ingresos": { - "Productos": {}, - "Servicios": {}, - "root_type": "Income" - }, - "05 - Costos": { - "Costo de Ventas": { - "account_type": "Cost of Goods Sold" - }, - "Costos Incluidos en la Valuaci\u00f3n": { - "account_type": "Expenses Included In Valuation" - }, - "Merma o Ajuste de Inventario": { - "account_type": "Stock Adjustment" - }, - "root_type": "Expense" - }, - "06 - Gastos": { - "Alquileres": {}, - "Depreciaciones": { - "account_type": "Depreciation" - }, - "Gastos Diversos": {}, - "Gastos de Personal": {}, - "Honorarios Profesionales": {}, - "Mantenimiento": {}, - "Seguros": {}, - "Servicios B\u00e1sicos": {}, - "root_type": "Expense" - }, - "07 - Otros Gastos y Productos Financieros": { - "Otros Gastos": { - "Otros Gastos y Productos Financieros 2": { - "Intereses 1": {}, - "Otros Gastos Financieros 1": {} - } - }, - "Otros Ingresos": { - "Otros Gastos y Productos Financieros 1": { - "Intereses": {}, - "Otros Gastos Financieros": {} - } - }, - "root_type": "Expense" - }, - "1 - Activos": { - "1. Activo Corriente": { - "1.10 Activos Corrientes Adicionales": { - "1.10.1 Inversiones Corrientes no Clasificados como Equivalentes de Caja y Bancos": {}, - "1.10.2 Activos Diferidos o Restringidos": { - "1.10.2.1 Cr\u00e9dito Fiscal (IVA Por Cobrar)": { - "account_type": "Chargeable", - "is_group": 1 - }, - "account_type": "Chargeable" - }, - "account_type": "Chargeable" - }, - "1.2 Inversion en Propiedades": { - "1.2.1 Inversion Inmobiliaria Bajo Construccion": { - "account_type": "Chargeable" - }, - "1.2.2 Inversion Inmobiliaria Construida": { - "account_type": "Chargeable", - "is_group": 1 - }, - "account_type": "Chargeable" - }, - "1.3 Activos Intangibles": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.4 Activos Financieros": { - "1.4.1 Inversion o Participaci\u00f3n Accionaria en Empresas Afiliadas": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.4.2 Inversiones Burs\u00e1tiles e Instrumentos Financieros": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.4.3 Activos Financieros Derivados": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.4.4 Otros Activos Financieros": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.4.5 Provisi\u00f3n por Riesgo de Cr\u00e9dito (agregado) (Contra-activo)": { - "account_type": "Round Off", - "is_group": 1 - }, - "1.4.6 Activos Financieros Clasificados por Designaci\u00f3n": { - "account_type": "Chargeable", - "is_group": 1 - }, - "account_type": "Chargeable" - }, - "1.5 Activos Biol\u00f3gicos": { - "1.5.1 Activos Biol\u00f3gicos al Costo": { - "account_type": "Stock", - "is_group": 1 - }, - "1.5.2 Activos Biol\u00f3gicos a Valor Razonable": { - "1.5.2.1 Animales": { - "account_type": "Stock", - "is_group": 1 - }, - "1.5.2.2 Plantas": { - "1.5.2.2.1 Division productiva 1er nivel EJEMPLO": { - "1.5.2.2.1.1 Division Productiva 2do nivel EJEMPLO": { - "1.5.2.2.1.1.1 Division Productiva 3er Nivel EJEMPLO": { - "1.5.2.2.1.1.1.1 Divisi\u00f3n Productiva 4\u00ba Nivel EJEMPLO": {}, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "1.6 Activos Devengables y Otros Activos": { - "1.6.1 Pagos Anticipados y Otros Activos Circulantes": { - "1.6.1.0 Seguro Pagado Anticipadamente": { - "account_type": "Chargeable" - }, - "account_type": "Chargeable" - }, - "1.6.2 Cobrables Relacionados con Impuestos": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.6.3 Proveedores de Servicio": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.6.4 Contratos de Construccion": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.6.5 Costos de Montaje": { - "account_type": "Chargeable", - "is_group": 1 - }, - "1.6.6 Activos Adicionales y Otros": { - "account_type": "Chargeable", - "is_group": 1 - }, - "account_type": "Chargeable" - }, - "1.7 Inventario": { - "1.7.1 Materia Prima": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.10 Inventarios Pignorados Como Garant\u00eda de Pasivo": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.11 Inventarios a Valor Razonable Menos Costos de Venta": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.2 Mercader\u00eda (Mercanc\u00edas)": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.3 Suministros de Producci\u00f3n y Consumibles": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.4 Repuestos": { - "1.7.4.0 Respuestos en Transito": { - "account_type": "Stock", - "is_group": 1 - }, - "account_type": "Stock" - }, - "1.7.5 Combustibles": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.6 Trabajo en Progeso": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.7 Producto Terminado": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.8 Art\u00edculos de Inventario Adicionales": { - "account_type": "Stock", - "is_group": 1 - }, - "1.7.9 Otros Inventarios": { - "1.7.9.1 Merma o Ajuste de Inventario": { - "account_type": "Stock Adjustment", - "is_group": 1 - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "1.8 Cobrables": { - "1.8.1 Ventas al Cr\u00e9dito": { - "account_type": "Receivable", - "is_group": 1 - }, - "1.8.2 Activos bajo Contrato": { - "account_type": "Receivable", - "is_group": 1 - }, - "1.8.3 Otras Cuentas por Cobrar": { - "1.8.3.1 Cuentas por Cobrar a Otras Entidades no Afiliadas": { - "1.8.3.1.1 Compa\u00f1\u00eda No Afiliada (EJEMPLO)": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "1.8.3.2 Cuentas Por Cobrar Compa\u00f1\u00edas Afiliadas": { - "1.8.3.2.1 Compa\u00f1\u00eda subsidiaria (EJEMPLO)": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "1.8.3.3 Cuentas por Cobrar a Empleados": { - "1.8.3.3.1 Prestamo EJEMPLO": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "1.8.4 Ajustes": { - "account_type": "Chargeable", - "is_group": 1 - }, - "account_type": "Receivable" - }, - "1.9 Caja y Equivalentes": { - "1.9.1 Caja": { - "account_type": "Cash", - "is_group": 1 - }, - "1.9.2 Equivalentes de Efectivo (Bancos)": { - "1.9.2.1 Bancos Nacionales": { - "1.9.2.1.1 Banco Industrial": { - "account_type": "Bank", - "is_group": 1 - }, - "1.9.2.1.2 Banco Agromercantil de Guatemala": { - "account_type": "Bank" - }, - "1.9.2.1.3 Banco Prom\u00e9rica": { - "account_type": "Bank" - }, - "1.9.2.1.4 Banco de Am\u00e9rica Central": { - "account_type": "Bank" - }, - "1.9.2.1.5 Banco G&T Continental": { - "account_type": "Bank" - }, - "1.9.2.1.6 Banco Internacional": { - "account_type": "Bank" - }, - "1.9.2.1.7 Banco de Desarrollo Rural": { - "account_type": "Bank" - }, - "1.9.2.1.8 Banco de los Trabajadores": { - "account_type": "Bank" - }, - "1.9.2.1.9 Vivibanco": { - "account_type": "Bank" - }, - "account_type": "Bank" - }, - "1.9.2.2 Bancos Internacionales": { - "1.9.2.2.1 HSBC": { - "account_type": "Bank" - }, - "account_type": "Bank" - }, - "1.9.2.3 Cadena de Bloques (Blockchain)": { - "1.9.2.3.1 Billetera Bitcoin 1234567890abcdefg": { - "account_type": "Cash" - }, - "account_type": "Cash" - }, - "account_type": "Bank" - }, - "1.9.3 Inversiones a Corto Plazo": { - "account_type": "Bank", - "is_group": 1 - }, - "1.9.4 Otros Equivalentes de Caja y Bancos": { - "account_type": "Cash", - "is_group": 1 - }, - "account_type": "Bank" - }, - "Impuestos por Cobrar": { - "Retenciones de IVA recibidas": {} - } - }, - "No Corriente": { - "Activos Fijos": { - "account_type": "Fixed Asset" - }, - "Cargos Diferidos": {} - }, + "account_number": "3", "root_type": "Asset" } } diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json index fe4c484d9fa..3ed6b1dd469 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/hu_chart_of_accounts.json @@ -527,7 +527,7 @@ "root_type": "Liability" }, "5. SZ\u00c1MLAOSZT\u00c1LY K\u00d6LTS\u00c9GNEMEK": { - "51 - 53 ANYAGJELLEG\u00db R\u00c1FORD\u00cdT\u00c1SOK ": { + "51 - 53. ANYAGJELLEG\u00db R\u00c1FORD\u00cdT\u00c1SOK ": { "51. ANYAGK\u00d6LTS\u00c9G": { "511. V\u00e1s\u00e1rolt anyagok k\u00f6lts\u00e9gei ": { "5111. Alapanyag k\u00f6lts\u00e9gek": {}, @@ -618,23 +618,8 @@ "581. Saj\u00e1t termel\u00e9s\u0171 k\u00e9szletek \u00e1llom\u00e1nyv\u00e1ltoz\u00e1sa ": {}, "582. Saj\u00e1t el\u0151\u00e1ll\u00edt\u00e1s\u00fa eszk\u00f6z\u00f6k aktiv\u00e1lt \u00e9rt\u00e9ke": {}, "589. Aktiv\u00e1lt saj\u00e1t teljes\u00edtm\u00e9nyek \u00e1tvezet\u00e9si sz\u00e1mla": {} - }, - "59. K\u00d6LTS\u00c9GNEM ELLENSZ\u00c1MLA (els\u0151dleges k\u00f6lts\u00e9ghely-k\u00f6lts\u00e9gvisel\u0151 elsz\u00e1mol\u00f3s eset\u00e9n) ": { - "is_group": 1 - }, - "59. K\u00d6LTS\u00c9GNEM \u00c1TVEZET\u00c9SI SZ\u00c1MLA (els\u0151dleges k\u00f6lts\u00e9gnem-elsz\u00e1mol\u00e1s eset\u00e9n)": { - "is_group": 1 - }, - "59. K\u00d6LTS\u00c9GNEM \u00c1TVEZET\u00c9SI SZ\u00c1MLA (els\u0151dleges k\u00f6lts\u00e9gnem-elsz\u00e1mol\u00e1s eset\u00e9n, kiz\u00e1r\u00f3lag \u00f6sszk\u00f6lts\u00e9g elj\u00e1r\u00e1ssal)": { - "59/51. Anyagk\u00f6lts\u00e9g \u00e1tvezet\u00e9si sz\u00e1mla": {}, - "59/52. Ig\u00e9nybe vett szolg\u00e1ltat\u00e1sok k\u00f6lts\u00e9gei \u00e1tvezet\u00e9si sz\u00e1mla ": {}, - "59/53. Egy\u00e9b szolg\u00e1ltat\u00e1sok k\u00f6lts\u00e9gei \u00e1tvezet\u00e9si sz\u00e1mla ": {}, - "59/54. B\u00e9rk\u00f6lts\u00e9g \u00e1tvezet\u00e9si sz\u00e1mla": {}, - "59/55. Szem\u00e9lyi jelleg\u0171 egy\u00e9b kifizet\u00e9sek \u00e1tvezet\u00e9si sz\u00e1mla ": {}, - "59/56. B\u00e9rj\u00e1rul\u00e9kok \u00e1tvezet\u00e9si sz\u00e1mla": {}, - "59/57. \u00c9rt\u00e9kcs\u00f6kken\u00e9si le\u00edr\u00e1s \u00e1tvezet\u00e9si sz\u00e1mla ": {} - }, - "59. K\u00d6LTS\u00c9GNEM \u00c1TVEZET\u00c9SI SZ\u00c1MLA (kiz\u00e1r\u00f3lag k\u00f6lts\u00e9gnem-elsz\u00e1mol\u00e1s \u00e9s forgalmi k\u00f6lts\u00e9g elj\u00e1r\u00e1ssal)": { + }, + "59. K\u00d6LTS\u00c9GNEM \u00c1TVEZET\u00c9SI SZ\u00c1MLA": { "is_group": 1 }, "root_type": "Expense" diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json index b37e171f79e..37f57ec1ad9 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json @@ -2,358 +2,686 @@ "country_code": "id", "name": "Indonesia - Chart of Accounts", "tree": { - "1000.0000 Aktiva": { - "1100.0000 Aktiva Lancar": { - "1110.0000 Kas": { - "1111.000 Kas Rupiah": { - "1111.0010 Kas Kecil": { - "account_type": "Cash" - }, - "1111.0020 Kas Besar": { - "account_type": "Cash" - }, - "account_type": "Cash" + "Aktiva": { + "Aktiva Lancar": { + "Akun sementara": { + "Pembukaan sementara": { + "account_number": "1171.000", + "account_type": "Temporary" }, - "1112.000 Kas Mata Uang Lain": { - "1112.0010 Kas USD": { - "account_type": "Cash" - } - } + "account_number": "1170.000" }, - "1120.000 Bank ": { - "1121.000 Bank Rupiah": { - "is_group": 1 + "Bank ": { + "Bank Other Currency": { + "account_number": "1122.000", + "is_group": 1 }, - "1122.000 Bank Other Currency": { - "is_group": 1 + "Bank Rupiah": { + "account_number": "1121.000", + "is_group": 1 }, + "account_number": "1120.000", "account_type": "Bank" }, - "1130.000 Piutang": { - "1131.000 Piutang Dagang": { - "1131.0010 Piutang Dagang": { - "account_type": "Receivable" - } + "Biaya di Bayar di Muka": { + "Biaya di Bayar di Muka": { + "Biaya di Bayar di Muka": { + "Biaya d Bayar di Muka": { + "account_number": "1151.00111" + }, + "account_number": "1151.001" + }, + "account_number": "1151.000" }, - "1132.000 Piutang Lain lain": { - "1132.001 Piutang Lain-lain 1": { - "account_type": "Receivable" - } - } + "account_number": "1150.000" }, - "1140.000 Persediaan Barang": { - "1141.000 Persediaan Barang": { + "Kas": { + "Kas Mata Uang Lain": { + "Kas USD": { + "account_number": "1112.0010", + "account_type": "Cash" + }, + "account_number": "1112.000" + }, + "Kas Rupiah": { + "Kas Besar": { + "account_number": "1111.0020", + "account_type": "Cash" + }, + "Kas Kecil": { + "account_number": "1111.0010", + "account_type": "Cash" + }, + "account_number": "1111.000", + "account_type": "Cash" + }, + "account_number": "1110.0000" + }, + "Pendapatan Yang Akan di Terima": { + "Pendapatan Yang di Terima": { + "Pendapatan Yang Akan di Terima": { + "account_number": "1161.001" + }, + "account_number": "1161.000" + }, + "account_number": "1160.000" + }, + "Persediaan Barang": { + "Persediaan Barang": { + "account_number": "1141.000", "account_type": "Stock", "is_group": 1 }, - "1142.000 Uang Muka Pembelian": { - "1142.001 Uang Muka Pembelian": { + "Uang Muka Pembelian": { + "Uang Muka Pembelian": { + "account_number": "1142.001", "account_type": "Bank" - } - } - }, - "1150.000 Biaya di Bayar di Muka": { - "1151.000 Biaya di Bayar di Muka": { - "1151.001 Biaya di Bayar di Muka": { - "1151.00111 Biaya d Bayar di Muka": {} - } - } - }, - "1160.000 Pendapatan Yang Akan di Terima": { - "1161.000 Pendapatan Yang di Terima": { - "1161.001 Pendapatan Yang Akan di Terima": {} - } - }, - "1170.000 Akun sementara": { - "1171.000 Pembukaan sementara": { - "account_type": "Temporary" - } - } - }, - "1200.000 Aktiva Tetap": { - "1210.000 Aktiva": { - "1211.000 Aktiva": { - "1211.001 Aktiva": { - "account_type": "Fixed Asset" - } + }, + "account_number": "1142.000" }, - "1212.000 Akumulasi Penyusutan Aktiva": { - "1212.001 Akumulasi Penyusutan Aktiva": { - "account_type": "Accumulated Depreciation" - } - } + "account_number": "1140.000" }, - "1230.000 Investasi": { - "1231.000 Investasi": { - "1231.001 Investai Saham": { - "1231.0011 Investasi Saham": {} + "Piutang": { + "Piutang Dagang": { + "Piutang Dagang": { + "account_number": "1131.0010", + "account_type": "Receivable" }, - "1231.002 Investasi Perumahan": { - "1231.0021 Investasi Perumahan": {} + "account_number": "1131.000" + }, + "Piutang Lain lain": { + "Piutang Lain-lain 1": { + "account_number": "1132.001", + "account_type": "Receivable" }, - "1231.003 Deposito": { - "is_group": 1 - } - } - } + "account_number": "1132.000" + }, + "account_number": "1130.000" + }, + "account_number": "1100.0000" }, + "Aktiva Tetap": { + "Aktiva": { + "Aktiva": { + "Aktiva": { + "account_number": "1211.001", + "account_type": "Fixed Asset" + }, + "account_number": "1211.000" + }, + "Akumulasi Penyusutan Aktiva": { + "Akumulasi Penyusutan Aktiva": { + "account_number": "1212.001", + "account_type": "Accumulated Depreciation" + }, + "account_number": "1212.000" + }, + "account_number": "1210.000" + }, + "Investasi": { + "Investasi": { + "Deposito": { + "account_number": "1231.003", + "is_group": 1 + }, + "Investai Saham": { + "Investasi Saham": { + "account_number": "1231.0011" + }, + "account_number": "1231.001" + }, + "Investasi Perumahan": { + "Investasi Perumahan": { + "account_number": "1231.0021" + }, + "account_number": "1231.002" + }, + "account_number": "1231.000" + }, + "account_number": "1230.000" + }, + "account_number": "1200.000" + }, + "account_number": "1000.0000", "root_type": "Asset" }, - "2000.000 Passiva": { - "2100.000 Pasiva Lancar": { - "2110.000 Hutang Dagang": { - "2111.000 Hutang Dagang Rupiah": { - "2111.001 Hutang Dagang Dalam Negeri": { - "account_type": "Payable" - }, - "2111.002 Hutang Dagang Luar Negeri": { - "account_type": "Payable" - }, - "2111.003 Hutang Dagang Biaya Kirim Dalam Negeri": { - "account_type": "Payable" - }, - "2111.004 HUtang Dagang Biaya Kirim Luar Negeri": { - "account_type": "Payable" - } + "Beban": { + "Beban Lain lain": { + "Beban Lain lain": { + "Beban Adm Bank": { + "account_number": "5510.001" }, - "2112.000 Hutang Dagang Other Currency": { - "2112.001 Hutang Dagang Luar Negeri (USD)": { - "account_type": "Payable" - }, - "2112.002 Hutang Dagang Luar Negeri (SGD)": { - "account_type": "Payable" - }, - "2112.003 Hutang Dagang Biaya Kirim Luar Negeri (USD)": { - "account_type": "Payable" - }, - "2112.004 Hutang Dagang Biaya Kirim Luar Negeri (SGD)": { - "account_type": "Payable" - }, - "2112.005 Hutang Dagang Biaya Kirim Dalam Negeri": { - "account_type": "Payable" - } + "Beban Bunga Kredit Rekening Koran Bank": { + "account_number": "5510.004" }, - "2115.000 Stock Diterima Tapi Tidak Ditagih": { - "account_type": "Stock Received But Not Billed" - } - }, - "2120.000 Pendapatan di Terima di Muka": { - "2121.000 Pendapatan di Terima di Muka": { - "2121.001 Dp Penjualan": { - "account_type": "Bank" - } - } - }, - "2130.000 Biaya Yang Akan di Bayar": { - "2131.000 Biaya Yang Akan di Bayar": { - "2131.001 Biaya Yang Akan di Bayar": {} + "Beban Bunga Pinjaman Pada Pihak Ke 3": { + "account_number": "5510.005" }, - "2132.000 Biaya Yang Akan di Bayar - Freight": { - "2132.001 Biaya Yang Akan di Bayar - Freight": { - "account_type": "Expenses Included In Valuation" - } - } - }, - "2140.000 Hutang Pajak": { - "2141.000 Hutang Pajak": { - "account_type": "Payable" - } - } - }, - "2200.000 Passiva Tetap": { - "2210.000 Hutang Pada Pihak ke 3": { - "2211.000 Pinjaman Pihak ke 3 Rutin": { - "2211.001 Hutang": {} + "Beban Notaris Dan ADM Kredit Bank": { + "account_number": "5510.003" }, - "2212.000 Pinjaman Pihak ke 3 Tidak Rutin": { - "2212.001 Hutang": {} + "Beban Pajak Bumi & Bangunan": { + "account_number": "5510.006" }, - "2213.000 Hutang Bunga Pinjaman Pihak Ke 3 Tidak Rutin": { - "2213.001 Hutang Bunga": {} - } + "Beban Pajak PPN": { + "account_number": "5510.008" + }, + "Beban Pajak Penghasilan ": { + "account_number": "5510.007" + }, + "Beban Provisi Pinjaman Bank": { + "account_number": "5510.002" + }, + "Selisih Kurs": { + "account_number": "5510.010", + "account_type": "Round Off" + }, + "Selisih Pembayaran Customer": { + "account_number": "5510.009", + "account_type": "Round Off" + }, + "account_number": "5510.000" }, - "2220.000 Hutang Pada Bank": { - "2221.000 Hutang Bank": { - "2221.001 Hutang": {} - } - }, - "2230.000 Hutang Leasing Kendaraan": { - "2231.000 Hutang Leasing Kendaraan": { - "2231.001 Hutang Leasing Kendaraan": {} - } - }, - "2240.000 Hutang Lain Lain": { - "2241.000 Hutang Lain Lain": { - "2241.001 Hutang": {} - } - } + "account_number": "5500.000" }, - "root_type": "Liability" - }, - "3000.000 Modal": { - "3100.000 Modal": { - "3110.000 Modal di Setor": {}, - "3120.000 Prive P.Saham": {}, - "3130.000 Saldo pembukaan Equity": {} - }, - "3200.000 Laba": { - "3210.000 Laba di Tahan": {}, - "3220.000 Laba Tahun Berjalan": {}, - "3230.000 Laba Periode Berjalan": {} - }, - "root_type": "Equity" - }, - "4000.000 Penjualan": { - "4100.000 Penjualan Barang Dagangan": { - "4110.000 Penjualan": {}, - "4120.000 Retur Penjualan": {}, - "4130.000 Potongan Penjualan": {} - }, - "4200.000 Harga Pokok Pembelian": { - "4210.000 HPP Pembelian": { - "account_type": "Cost of Goods Sold" - } - }, - "4300.000 Pendapatan Service/Jasa": { - "4310.000 Pendapatan Service": {} - }, - "4400.000 Pendapatan Lain lain": { - "4410.000 Pendapatan Bunga Bank": {}, - "4420.000 Pendapatan Bunga Dari Pihak Ke 3": {}, - "4430.000 Pendapatan Keuntungan Penjualan Aktiva": {}, - "4440.000 Pendapatan Komisi": {}, - "4450.000 Pendapatan Sewa Gudang": {}, - "4460.000 Pendapatan Sewa Lain lain": {}, - "4470.000 Pendapatan Penjualan Barang BS": {}, - "4480.000 Pendapatan Lain lain": {} - }, - "root_type": "Income" - }, - "5000.000 Beban": { - "5100.000 Beban Langsung": { - "5110.000 Beban Penjualan": { - "5110.001 Biaya BBM": {}, - "5110.002 Biaya Tol": {}, - "5110.003 Biaya Parkir": {}, - "5110.004 Biaya Upah Angkat/Turun Barang": {}, - "5110.005 Biaya Kuli": {}, - "5110.006 Biaya Perjalanan Dinas": {}, - "5110.007 Biaya Barang Rusak": {}, - "5110.008 Biaya Perbaikan Kendaraan Operasional": {}, - "5110.009 Biaya Asuransi Kendaraan Operasional": {}, - "5110.010 Biaya Leasing Kendaraan Operasional": {}, - "5110.011 Biaya Kebutuhan Penjualan": {}, - "5110.012 Biaya Sample": {}, - "5110.013 Biaya Bonus, Hadiah, dan Sampel": {}, - "5110.014 Biaya Entertainment dan Pergaulan": {}, - "5110.015 Biaya Sewa Gudang": {}, - "5110.016 Biaya Sewa Peralatan Gudang": {}, - "5110.017 Biaya Piutang Tak Tertagih": {}, - "5110.018 Potongan Supplier": {}, - "5110.019 Biaya Penjualan Lain Lain": {}, - "5110.020 Penyesuaian Stock": { + "Beban Langsung": { + "Beban Penjualan": { + "Biaya Asuransi Kendaraan Operasional": { + "account_number": "5110.009" + }, + "Biaya BBM": { + "account_number": "5110.001" + }, + "Biaya Barang Rusak": { + "account_number": "5110.007" + }, + "Biaya Bonus, Hadiah, dan Sampel": { + "account_number": "5110.013" + }, + "Biaya Entertainment dan Pergaulan": { + "account_number": "5110.014" + }, + "Biaya Kebutuhan Penjualan": { + "account_number": "5110.011" + }, + "Biaya Kuli": { + "account_number": "5110.005" + }, + "Biaya Leasing Kendaraan Operasional": { + "account_number": "5110.010" + }, + "Biaya Parkir": { + "account_number": "5110.003" + }, + "Biaya Penjualan Lain Lain": { + "account_number": "5110.019" + }, + "Biaya Perbaikan Kendaraan Operasional": { + "account_number": "5110.008" + }, + "Biaya Perjalanan Dinas": { + "account_number": "5110.006" + }, + "Biaya Piutang Tak Tertagih": { + "account_number": "5110.017" + }, + "Biaya Sample": { + "account_number": "5110.012" + }, + "Biaya Sewa Gudang": { + "account_number": "5110.015" + }, + "Biaya Sewa Peralatan Gudang": { + "account_number": "5110.016" + }, + "Biaya Susut Barang": { + "account_number": "5110.021" + }, + "Biaya Tol": { + "account_number": "5110.002" + }, + "Biaya Upah Angkat/Turun Barang": { + "account_number": "5110.004" + }, + "Penyesuaian Stock": { + "account_number": "5110.020", "account_type": "Stock Adjustment" }, - "5110.021 Biaya Susut Barang": {} - }, - "5120.000 Biaya Gaji & Kesejahteraan Pegawai": { - "5120.001 Biaya Gaji Staff & Karyawan Tetap": {}, - "5120.002 Biaya Gaji Karyawan Harian": {}, - "5120.003 Biaya Pengobatan": {}, - "5120.004 Biaya Asuransi Kesehatan Pegawai": {}, - "5120.005 Biaya THR, Bonus, dan Komisi": {}, - "5120.006 Biaya Konsumsi": {}, - "5120.007 Biaya Gaji & Kesejahteraan Lainnya": {} - }, - "5130.000 Biaya Kantor & Gudang": { - "5130.001 Biaya PLN Gudang & Kantor": {}, - "5130.002 Biaya PAM Gudang & Kantor": {}, - "5130.003 Biaya TLP Gudang & Kantor": {}, - "5130.004 Biaya Fotocopy, Photo, Print Out": {}, - "5130.005 Biaya Alat Tulis Kantor": {}, - "5130.006 Biaya Stamp Duty & Pos": {}, - "5130.007 Biaya Servis Peralatan Gudang": {}, - "5130.008 Biaya Pemeliharaan Bgn Gudang": {}, - "5130.009 Biaya Humas & Pergaulan": {}, - "5130.010 Biaya Perlengkapan Gudang": {}, - "5130.011 Iuran Bulanan": {}, - "5130.012 Biaya Serba Serbi": {}, - "5130.013 Biaya Sewa Kantor": {}, - "5130.014 Biaya Asuransi Bangunan": {}, - "5130.015 Biaya Sumbangan": {}, - "5130.016 Biaya Perizinan Usaha dan Bangunan": {}, - "5130.017 Biaya Perizinan Kendaraan Operasional": {}, - "5130.018 Biaya KTR & GDG Lain Lain": {} - } - }, - "5200.000 Beban Tidak Langsung": { - "5210.000 Biaya Gaji & Kesejahteraan Pegawai Indirect": { - "5210.001 Biaya Gaji Staff": {}, - "5210.002 Biaya THR dan Bonus Staff": {}, - "5210.003 Biaya Pengobatan & Kesehatan": {}, - "5210.004 Biaya Konsumsi": {}, - "5210.005 Biaya Gaji Lain Lain": {} - }, - "5220.000 Biaya Operational Indirect": { - "5220.001 Biaya BBM": {}, - "5220.002 Biaya Tol & Parkir": {}, - "5220.003 Biaya TLP & HP": {}, - "5220.004 Biaya Perjalanan Dinas": {}, - "5220.005 Biaya Perbaikan Kendaraan Dinas": {}, - "5220.006 Biaya Asuransi Kendaraan Dinas": {}, - "5220.007 Biaya Leasing Kendaraan Dinas": {}, - "5220.008 Biaya Entertainment dan Pergaulan": {}, - "5220.009 Biaya Hadiah dan Bonus": {} - }, - "5230.000 Biaya Kantor Indirect": { - "5230.001 Biaya PLN Kantor": {}, - "5230.002 Biaya PAM Kantor": {}, - "5230.003 Biaya TLP Kantor": {}, - "5230.004 Biaya Sewa Kantor": {}, - "5230.005 Biaya Asuransi Bangunan": {}, - "5230.006 Biaya Alat Tulis Kantor": {}, - "5230.007 Biaya Fotocopy, Photo, Print Out": {}, - "5230.008 Biaya Kirim Dokumen": {}, - "5230.009 Biaya Perlengkapan & Peralatan Kantor": {}, - "5230.010 Service Peralatan Kantor": {}, - "5230.011 Biaya Pemeliharaan Bangunan Kantor": {}, - "5230.012 Biaya Iuran Bulanan": {}, - "5230.013 Biaya Sumbangan": {}, - "5230.014 Biaya Perizinan Bangunan": {}, - "5230.015 Biaya Perizinan Kendaraan Dinas": {}, - "5230.016 Biaya KTR Lain Lain": {}, - "5230.017 Biaya Stamp Duty & Pos": {} - } - }, - "5300.000 Biaya Penyusutan": { - "5310.000 Biaya Penyusutan": { - "5310.001 By Peny Aktiva ": { - "account_type": "Depreciation" - } - } - }, - "5400.000 Biaya Amortisasi": { - "5410.000 Biaya Amortisasi": {} - }, - "5500.000 Beban Lain lain": { - "5510.000 Beban Lain lain": { - "5510.001 Beban Adm Bank": {}, - "5510.002 Beban Provisi Pinjaman Bank": {}, - "5510.003 Beban Notaris Dan ADM Kredit Bank": {}, - "5510.004 Beban Bunga Kredit Rekening Koran Bank": {}, - "5510.005 Beban Bunga Pinjaman Pada Pihak Ke 3": {}, - "5510.006 Beban Pajak Bumi & Bangunan": {}, - "5510.007 Beban Pajak Penghasilan ": {}, - "5510.008 Beban Pajak PPN": {}, - "5510.009 Selisih Pembayaran Customer": { - "account_type": "Round Off" + "Potongan Supplier": { + "account_number": "5110.018" }, - "5510.010 Selisih Kurs": { - "account_type": "Round Off" - } - } + "account_number": "5110.000" + }, + "Biaya Gaji & Kesejahteraan Pegawai": { + "Biaya Asuransi Kesehatan Pegawai": { + "account_number": "5120.004" + }, + "Biaya Gaji & Kesejahteraan Lainnya": { + "account_number": "5120.007" + }, + "Biaya Gaji Karyawan Harian": { + "account_number": "5120.002" + }, + "Biaya Gaji Staff & Karyawan Tetap": { + "account_number": "5120.001" + }, + "Biaya Konsumsi": { + "account_number": "5120.006" + }, + "Biaya Pengobatan": { + "account_number": "5120.003" + }, + "Biaya THR, Bonus, dan Komisi": { + "account_number": "5120.005" + }, + "account_number": "5120.000" + }, + "Biaya Kantor & Gudang": { + "Biaya Alat Tulis Kantor": { + "account_number": "5130.005" + }, + "Biaya Asuransi Bangunan": { + "account_number": "5130.014" + }, + "Biaya Fotocopy, Photo, Print Out": { + "account_number": "5130.004" + }, + "Biaya Humas & Pergaulan": { + "account_number": "5130.009" + }, + "Biaya KTR & GDG Lain Lain": { + "account_number": "5130.018" + }, + "Biaya PAM Gudang & Kantor": { + "account_number": "5130.002" + }, + "Biaya PLN Gudang & Kantor": { + "account_number": "5130.001" + }, + "Biaya Pemeliharaan Bgn Gudang": { + "account_number": "5130.008" + }, + "Biaya Perizinan Kendaraan Operasional": { + "account_number": "5130.017" + }, + "Biaya Perizinan Usaha dan Bangunan": { + "account_number": "5130.016" + }, + "Biaya Perlengkapan Gudang": { + "account_number": "5130.010" + }, + "Biaya Serba Serbi": { + "account_number": "5130.012" + }, + "Biaya Servis Peralatan Gudang": { + "account_number": "5130.007" + }, + "Biaya Sewa Kantor": { + "account_number": "5130.013" + }, + "Biaya Stamp Duty & Pos": { + "account_number": "5130.006" + }, + "Biaya Sumbangan": { + "account_number": "5130.015" + }, + "Biaya TLP Gudang & Kantor": { + "account_number": "5130.003" + }, + "Iuran Bulanan": { + "account_number": "5130.011" + }, + "account_number": "5130.000" + }, + "account_number": "5100.000" }, + "Beban Tidak Langsung": { + "Biaya Gaji & Kesejahteraan Pegawai Indirect": { + "Biaya Gaji Lain Lain": { + "account_number": "5210.005" + }, + "Biaya Gaji Staff": { + "account_number": "5210.001" + }, + "Biaya Konsumsi": { + "account_number": "5210.004" + }, + "Biaya Pengobatan & Kesehatan": { + "account_number": "5210.003" + }, + "Biaya THR dan Bonus Staff": { + "account_number": "5210.002" + }, + "account_number": "5210.000" + }, + "Biaya Kantor Indirect": { + "Biaya Alat Tulis Kantor": { + "account_number": "5230.006" + }, + "Biaya Asuransi Bangunan": { + "account_number": "5230.005" + }, + "Biaya Fotocopy, Photo, Print Out": { + "account_number": "5230.007" + }, + "Biaya Iuran Bulanan": { + "account_number": "5230.012" + }, + "Biaya KTR Lain Lain": { + "account_number": "5230.016" + }, + "Biaya Kirim Dokumen": { + "account_number": "5230.008" + }, + "Biaya PAM Kantor": { + "account_number": "5230.002" + }, + "Biaya PLN Kantor": { + "account_number": "5230.001" + }, + "Biaya Pemeliharaan Bangunan Kantor": { + "account_number": "5230.011" + }, + "Biaya Perizinan Bangunan": { + "account_number": "5230.014" + }, + "Biaya Perizinan Kendaraan Dinas": { + "account_number": "5230.015" + }, + "Biaya Perlengkapan & Peralatan Kantor": { + "account_number": "5230.009" + }, + "Biaya Sewa Kantor": { + "account_number": "5230.004" + }, + "Biaya Stamp Duty & Pos": { + "account_number": "5230.017" + }, + "Biaya Sumbangan": { + "account_number": "5230.013" + }, + "Biaya TLP Kantor": { + "account_number": "5230.003" + }, + "Service Peralatan Kantor": { + "account_number": "5230.010" + }, + "account_number": "5230.000" + }, + "Biaya Operational Indirect": { + "Biaya Asuransi Kendaraan Dinas": { + "account_number": "5220.006" + }, + "Biaya BBM": { + "account_number": "5220.001" + }, + "Biaya Entertainment dan Pergaulan": { + "account_number": "5220.008" + }, + "Biaya Hadiah dan Bonus": { + "account_number": "5220.009" + }, + "Biaya Leasing Kendaraan Dinas": { + "account_number": "5220.007" + }, + "Biaya Perbaikan Kendaraan Dinas": { + "account_number": "5220.005" + }, + "Biaya Perjalanan Dinas": { + "account_number": "5220.004" + }, + "Biaya TLP & HP": { + "account_number": "5220.003" + }, + "Biaya Tol & Parkir": { + "account_number": "5220.002" + }, + "account_number": "5220.000" + }, + "account_number": "5200.000" + }, + "Biaya Amortisasi": { + "Biaya Amortisasi": { + "account_number": "5410.000" + }, + "account_number": "5400.000" + }, + "Biaya Penyusutan": { + "Biaya Penyusutan": { + "By Peny Aktiva ": { + "account_number": "5310.001", + "account_type": "Depreciation" + }, + "account_number": "5310.000" + }, + "account_number": "5300.000" + }, + "account_number": "5000.000", "root_type": "Expense" + }, + "Modal": { + "Laba": { + "Laba Periode Berjalan": { + "account_number": "3230.000" + }, + "Laba Tahun Berjalan": { + "account_number": "3220.000" + }, + "Laba di Tahan": { + "account_number": "3210.000" + }, + "account_number": "3200.000" + }, + "Modal": { + "Modal di Setor": { + "account_number": "3110.000" + }, + "Prive P.Saham": { + "account_number": "3120.000" + }, + "Saldo pembukaan Equity": { + "account_number": "3130.000" + }, + "account_number": "3100.000" + }, + "account_number": "3000.000", + "root_type": "Equity" + }, + "Passiva": { + "Pasiva Lancar": { + "Biaya Yang Akan di Bayar": { + "Biaya Yang Akan di Bayar": { + "Biaya Yang Akan di Bayar": { + "account_number": "2131.001" + }, + "account_number": "2131.000" + }, + "Biaya Yang Akan di Bayar - Freight": { + "Biaya Yang Akan di Bayar - Freight": { + "account_number": "2132.001", + "account_type": "Expenses Included In Valuation" + }, + "account_number": "2132.000" + }, + "account_number": "2130.000" + }, + "Hutang Dagang": { + "Hutang Dagang Other Currency": { + "Hutang Dagang Biaya Kirim Dalam Negeri": { + "account_number": "2112.005", + "account_type": "Payable" + }, + "Hutang Dagang Biaya Kirim Luar Negeri (SGD)": { + "account_number": "2112.004", + "account_type": "Payable" + }, + "Hutang Dagang Biaya Kirim Luar Negeri (USD)": { + "account_number": "2112.003", + "account_type": "Payable" + }, + "Hutang Dagang Luar Negeri (SGD)": { + "account_number": "2112.002", + "account_type": "Payable" + }, + "Hutang Dagang Luar Negeri (USD)": { + "account_number": "2112.001", + "account_type": "Payable" + }, + "account_number": "2112.000" + }, + "Hutang Dagang Rupiah": { + "HUtang Dagang Biaya Kirim Luar Negeri": { + "account_number": "2111.004", + "account_type": "Payable" + }, + "Hutang Dagang Biaya Kirim Dalam Negeri": { + "account_number": "2111.003", + "account_type": "Payable" + }, + "Hutang Dagang Dalam Negeri": { + "account_number": "2111.001", + "account_type": "Payable" + }, + "Hutang Dagang Luar Negeri": { + "account_number": "2111.002", + "account_type": "Payable" + }, + "account_number": "2111.000" + }, + "Stock Diterima Tapi Tidak Ditagih": { + "account_number": "2115.000", + "account_type": "Stock Received But Not Billed" + }, + "account_number": "2110.000" + }, + "Hutang Pajak": { + "Hutang Pajak": { + "account_number": "2141.000", + "account_type": "Payable" + }, + "account_number": "2140.000" + }, + "Pendapatan di Terima di Muka": { + "Pendapatan di Terima di Muka": { + "Dp Penjualan": { + "account_number": "2121.001", + "account_type": "Bank" + }, + "account_number": "2121.000" + }, + "account_number": "2120.000" + }, + "account_number": "2100.000" + }, + "Passiva Tetap": { + "Hutang Lain Lain": { + "Hutang Lain Lain": { + "Hutang": { + "account_number": "2241.001" + }, + "account_number": "2241.000" + }, + "account_number": "2240.000" + }, + "Hutang Leasing Kendaraan": { + "Hutang Leasing Kendaraan": { + "Hutang Leasing Kendaraan": { + "account_number": "2231.001" + }, + "account_number": "2231.000" + }, + "account_number": "2230.000" + }, + "Hutang Pada Bank": { + "Hutang Bank": { + "Hutang": { + "account_number": "2221.001" + }, + "account_number": "2221.000" + }, + "account_number": "2220.000" + }, + "Hutang Pada Pihak ke 3": { + "Hutang Bunga Pinjaman Pihak Ke 3 Tidak Rutin": { + "Hutang Bunga": { + "account_number": "2213.001" + }, + "account_number": "2213.000" + }, + "Pinjaman Pihak ke 3 Rutin": { + "Hutang": { + "account_number": "2211.001" + }, + "account_number": "2211.000" + }, + "Pinjaman Pihak ke 3 Tidak Rutin": { + "Hutang": { + "account_number": "2212.001" + }, + "account_number": "2212.000" + }, + "account_number": "2210.000" + }, + "account_number": "2200.000" + }, + "account_number": "2000.000", + "root_type": "Liability" + }, + "Penjualan": { + "Harga Pokok Pembelian": { + "HPP Pembelian": { + "account_number": "4210.000", + "account_type": "Cost of Goods Sold" + }, + "account_number": "4200.000" + }, + "Pendapatan Lain lain": { + "Pendapatan Bunga Bank": { + "account_number": "4410.000" + }, + "Pendapatan Bunga Dari Pihak Ke 3": { + "account_number": "4420.000" + }, + "Pendapatan Keuntungan Penjualan Aktiva": { + "account_number": "4430.000" + }, + "Pendapatan Komisi": { + "account_number": "4440.000" + }, + "Pendapatan Lain lain": { + "account_number": "4480.000" + }, + "Pendapatan Penjualan Barang BS": { + "account_number": "4470.000" + }, + "Pendapatan Sewa Gudang": { + "account_number": "4450.000" + }, + "Pendapatan Sewa Lain lain": { + "account_number": "4460.000" + }, + "account_number": "4400.000" + }, + "Pendapatan Service/Jasa": { + "Pendapatan Service": { + "account_number": "4310.000" + }, + "account_number": "4300.000" + }, + "Penjualan Barang Dagangan": { + "Penjualan": { + "account_number": "4110.000" + }, + "Potongan Penjualan": { + "account_number": "4130.000" + }, + "Retur Penjualan": { + "account_number": "4120.000" + }, + "account_number": "4100.000" + }, + "account_number": "4000.000", + "root_type": "Income" } } } \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json index 2f5dbf3a53b..bc7f9659564 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json @@ -2,160 +2,161 @@ "country_code": "in", "name": "India - Chart of Accounts", "tree": { - "Application of Funds (Assets)": { - "Current Assets": { - "Accounts Receivable": { - "Debtors": { - "account_type": "Receivable" - } - }, - "Bank Accounts": { - "account_type": "Bank", - "is_group": 1 - }, - "Cash In Hand": { - "Cash": { - "account_type": "Cash" - }, - "account_type": "Cash" - }, - "Loans and Advances (Assets)": { - "is_group": 1 - }, - "Securities and Deposits": { - "Earnest Money": {} - }, - "Stock Assets": { - "Stock in Hand": { - "account_type": "Stock" - } - }, - "Tax Assets": { - "is_group": 1 - } - }, - "Fixed Assets": { - "Capital Equipments": { - "account_type": "Fixed Asset" - }, - "Electronic Equipments": { - "account_type": "Fixed Asset" - }, - "Furnitures and Fixtures": { - "account_type": "Fixed Asset" - }, - "Office Equipments": { - "account_type": "Fixed Asset" - }, - "Plants and Machineries": { - "account_type": "Fixed Asset" - }, - "Buildings": { - "account_type": "Fixed Asset" - }, - "Accumulated Depreciations": { - "account_type": "Accumulated Depreciation" - } - }, - "Investments": { - "is_group": 1 - }, - "Temporary Accounts": { - "Temporary Opening": { - "account_type": "Temporary" - } - }, - "root_type": "Asset" - }, - "Expenses": { - "Direct Expenses": { - "Stock Expenses": { - "Cost of Goods Sold": { - "account_type": "Cost of Goods Sold" - }, - "Expenses Included In Valuation": { - "account_type": "Expenses Included In Valuation" - }, - "Stock Adjustment": { - "account_type": "Stock Adjustment" - } - } - }, - "Indirect Expenses": { - "Administrative Expenses": {}, - "Commission on Sales": {}, - "Depreciation": { - "account_type": "Depreciation" - }, - "Entertainment Expenses": {}, - "Freight and Forwarding Charges": { - "account_type": "Chargeable" - }, - "Legal Expenses": {}, - "Marketing Expenses": {}, - "Miscellaneous Expenses": {}, - "Office Maintenance Expenses": {}, - "Office Rent": {}, - "Postal Expenses": {}, - "Print and Stationary": {}, - "Rounded Off": { - "account_type": "Round Off" - }, - "Salary": {}, - "Sales Expenses": {}, - "Telephone Expenses": {}, - "Travel Expenses": {}, - "Utility Expenses": {}, - "Write Off": {}, - "Exchange Gain/Loss": {}, - "Gain/Loss on Asset Disposal": {} - }, - "root_type": "Expense" - }, - "Income": { - "Direct Income": { - "Sales": { - "account_type": "Income Account" - }, - "Service": { - "account_type": "Income Account" - }, - "account_type": "Income Account" - }, - "Indirect Income": { - "account_type": "Income Account", - "is_group": 1 - }, - "root_type": "Income" - }, - "Source of Funds (Liabilities)": { - "Capital Account": { - "Reserves and Surplus": {}, - "Shareholders Funds": {} - }, - "Current Liabilities": { - "Accounts Payable": { - "Creditors": { - "account_type": "Payable" - }, - "Payroll Payable": {} - }, - "Stock Liabilities": { - "Stock Received But Not Billed": { - "account_type": "Stock Received But Not Billed" - } - }, - "Duties and Taxes": { - "account_type": "Tax", - "is_group": 1 - }, - "Loans (Liabilities)": { - "Secured Loans": {}, - "Unsecured Loans": {}, - "Bank Overdraft Account": {} - } - }, - "root_type": "Liability" - } - } + "Application of Funds (Assets)": { + "Current Assets": { + "Accounts Receivable": { + "Debtors": { + "account_type": "Receivable" + } + }, + "Bank Accounts": { + "account_type": "Bank", + "is_group": 1 + }, + "Cash In Hand": { + "Cash": { + "account_type": "Cash" + }, + "account_type": "Cash" + }, + "Loans and Advances (Assets)": { + "is_group": 1 + }, + "Securities and Deposits": { + "Earnest Money": {} + }, + "Stock Assets": { + "Stock In Hand": { + "account_type": "Stock" + }, + "account_type": "Stock" + }, + "Tax Assets": { + "is_group": 1 + } + }, + "Fixed Assets": { + "Capital Equipments": { + "account_type": "Fixed Asset" + }, + "Electronic Equipments": { + "account_type": "Fixed Asset" + }, + "Furnitures and Fixtures": { + "account_type": "Fixed Asset" + }, + "Office Equipments": { + "account_type": "Fixed Asset" + }, + "Plants and Machineries": { + "account_type": "Fixed Asset" + }, + "Buildings": { + "account_type": "Fixed Asset" + }, + "Accumulated Depreciations": { + "account_type": "Accumulated Depreciation" + } + }, + "Investments": { + "is_group": 1 + }, + "Temporary Accounts": { + "Temporary Opening": { + "account_type": "Temporary" + } + }, + "root_type": "Asset" + }, + "Expenses": { + "Direct Expenses": { + "Stock Expenses": { + "Cost of Goods Sold": { + "account_type": "Cost of Goods Sold" + }, + "Expenses Included In Valuation": { + "account_type": "Expenses Included In Valuation" + }, + "Stock Adjustment": { + "account_type": "Stock Adjustment" + } + } + }, + "Indirect Expenses": { + "Administrative Expenses": {}, + "Commission on Sales": {}, + "Depreciation": { + "account_type": "Depreciation" + }, + "Entertainment Expenses": {}, + "Freight and Forwarding Charges": { + "account_type": "Chargeable" + }, + "Legal Expenses": {}, + "Marketing Expenses": {}, + "Miscellaneous Expenses": {}, + "Office Maintenance Expenses": {}, + "Office Rent": {}, + "Postal Expenses": {}, + "Print and Stationary": {}, + "Rounded Off": { + "account_type": "Round Off" + }, + "Salary": {}, + "Sales Expenses": {}, + "Telephone Expenses": {}, + "Travel Expenses": {}, + "Utility Expenses": {}, + "Write Off": {}, + "Exchange Gain/Loss": {}, + "Gain/Loss on Asset Disposal": {} + }, + "root_type": "Expense" + }, + "Income": { + "Direct Income": { + "Sales": { + "account_type": "Income Account" + }, + "Service": { + "account_type": "Income Account" + }, + "account_type": "Income Account" + }, + "Indirect Income": { + "account_type": "Income Account", + "is_group": 1 + }, + "root_type": "Income" + }, + "Source of Funds (Liabilities)": { + "Capital Account": { + "Reserves and Surplus": {}, + "Shareholders Funds": {} + }, + "Current Liabilities": { + "Accounts Payable": { + "Creditors": { + "account_type": "Payable" + }, + "Payroll Payable": {} + }, + "Stock Liabilities": { + "Stock Received But Not Billed": { + "account_type": "Stock Received But Not Billed" + } + }, + "Duties and Taxes": { + "account_type": "Tax", + "is_group": 1 + }, + "Loans (Liabilities)": { + "Secured Loans": {}, + "Unsecured Loans": {}, + "Bank Overdraft Account": {} + } + }, + "root_type": "Liability" + } + } } diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py new file mode 100644 index 00000000000..bad84533a5a --- /dev/null +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py @@ -0,0 +1,275 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +from frappe import _ + +def get(): + return { + _("Application of Funds (Assets)"): { + _("Current Assets"): { + _("Accounts Receivable"): { + _("Debtors"): { + "account_type": "Receivable", + "account_number": "1310" + }, + "account_number": "1300" + }, + _("Bank Accounts"): { + "account_type": "Bank", + "is_group": 1, + "account_number": "1200" + }, + _("Cash In Hand"): { + _("Cash"): { + "account_type": "Cash", + "account_number": "1110" + }, + "account_type": "Cash", + "account_number": "1100" + }, + _("Loans and Advances (Assets)"): { + "is_group": 1, + "account_number": "1600" + }, + _("Securities and Deposits"): { + _("Earnest Money"): { + "account_number": "1651" + }, + "account_number": "1650" + }, + _("Stock Assets"): { + _("Stock In Hand"): { + "account_type": "Stock", + "account_number": "1410" + }, + "account_type": "Stock", + "account_number": "1400" + }, + _("Tax Assets"): { + "is_group": 1, + "account_number": "1500" + }, + "account_number": "1100-1600" + }, + _("Fixed Assets"): { + _("Capital Equipments"): { + "account_type": "Fixed Asset", + "account_number": "1710" + }, + _("Electronic Equipments"): { + "account_type": "Fixed Asset", + "account_number": "1720" + }, + _("Furnitures and Fixtures"): { + "account_type": "Fixed Asset", + "account_number": "1730" + }, + _("Office Equipments"): { + "account_type": "Fixed Asset", + "account_number": "1740" + }, + _("Plants and Machineries"): { + "account_type": "Fixed Asset", + "account_number": "1750" + }, + _("Buildings"): { + "account_type": "Fixed Asset", + "account_number": "1760" + }, + _("Softwares"): { + "account_type": "Fixed Asset", + "account_number": "1770" + }, + _("Accumulated Depreciation"): { + "account_type": "Accumulated Depreciation", + "account_number": "1780" + }, + "account_number": "1700" + }, + _("Investments"): { + "is_group": 1, + "account_number": "1800" + }, + _("Temporary Accounts"): { + _("Temporary Opening"): { + "account_type": "Temporary", + "account_number": "1910" + }, + "account_number": "1900" + }, + "root_type": "Asset", + "account_number": "1000" + }, + _("Expenses"): { + _("Direct Expenses"): { + _("Stock Expenses"): { + _("Cost of Goods Sold"): { + "account_type": "Cost of Goods Sold", + "account_number": "5111" + }, + _("Expenses Included In Valuation"): { + "account_type": "Expenses Included In Valuation", + "account_number": "5118" + }, + _("Stock Adjustment"): { + "account_type": "Stock Adjustment", + "account_number": "5119" + }, + "account_number": "5110" + }, + "account_number": "5100" + }, + _("Indirect Expenses"): { + _("Administrative Expenses"): { + "account_number": "5201" + }, + _("Commission on Sales"): { + "account_number": "5202" + }, + _("Depreciation"): { + "account_type": "Depreciation", + "account_number": "5203" + }, + _("Entertainment Expenses"): { + "account_number": "5204" + }, + _("Freight and Forwarding Charges"): { + "account_type": "Chargeable", + "account_number": "5205" + }, + _("Legal Expenses"): { + "account_number": "5206" + }, + _("Marketing Expenses"): { + "account_type": "Chargeable", + "account_number": "5207" + }, + _("Office Maintenance Expenses"): { + "account_number": "5208" + }, + _("Office Rent"): { + "account_number": "5209" + }, + _("Postal Expenses"): { + "account_number": "5210" + }, + _("Print and Stationery"): { + "account_number": "5211" + }, + _("Round Off"): { + "account_type": "Round Off", + "account_number": "5212" + }, + _("Salary"): { + "account_number": "5213" + }, + _("Sales Expenses"): { + "account_number": "5214" + }, + _("Telephone Expenses"): { + "account_number": "5215" + }, + _("Travel Expenses"): { + "account_number": "5216" + }, + _("Utility Expenses"): { + "account_number": "5217" + }, + _("Write Off"): { + "account_number": "5218" + }, + _("Exchange Gain/Loss"): { + "account_number": "5219" + }, + _("Gain/Loss on Asset Disposal"): { + "account_number": "5220" + }, + _("Miscellaneous Expenses"): { + "account_type": "Chargeable", + "account_number": "5221" + }, + "account_number": "5200" + }, + "root_type": "Expense", + "account_number": "5000" + }, + _("Income"): { + _("Direct Income"): { + _("Sales"): { + "account_number": "4110" + }, + _("Service"): { + "account_number": "4120" + }, + "account_number": "4100" + }, + _("Indirect Income"): { + "is_group": 1, + "account_number": "4200" + }, + "root_type": "Income", + "account_number": "4000" + }, + _("Source of Funds (Liabilities)"): { + _("Current Liabilities"): { + _("Accounts Payable"): { + _("Creditors"): { + "account_type": "Payable", + "account_number": "2110" + }, + _("Payroll Payable"): { + "account_number": "2120" + }, + "account_number": "2100" + }, + _("Stock Liabilities"): { + _("Stock Received But Not Billed"): { + "account_type": "Stock Received But Not Billed", + "account_number": "2210" + }, + "account_number": "2200" + }, + _("Duties and Taxes"): { + "account_type": "Tax", + "is_group": 1, + "account_number": "2300" + }, + _("Loans (Liabilities)"): { + _("Secured Loans"): { + "account_number": "2410" + }, + _("Unsecured Loans"): { + "account_number": "2420" + }, + _("Bank Overdraft Account"): { + "account_number": "2430" + }, + "account_number": "2400" + }, + "account_number": "2100-2400" + }, + "root_type": "Liability", + "account_number": "2000" + }, + _("Equity"): { + _("Capital Stock"): { + "account_type": "Equity", + "account_number": "3100" + }, + _("Dividends Paid"): { + "account_type": "Equity", + "account_number": "3200" + }, + _("Opening Balance Equity"): { + "account_type": "Equity", + "account_number": "3300" + }, + _("Retained Earnings"): { + "account_type": "Equity", + "account_number": "3400" + }, + "root_type": "Equity", + "account_number": "3000" + } + } diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/tw_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/tw_chart_of_accounts.json index a79283a40a9..166f8a7c72c 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/tw_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/tw_chart_of_accounts.json @@ -2,721 +2,1353 @@ "country_code": "tw", "name": "Taiwan - Chart of Accounts", "tree": { - "1-\u8cc7\u7522": { - "11~12-\u6d41\u52d5\u8cc7\u7522": { - "111-\u73fe\u91d1\u53ca\u7d04\u7576\u73fe\u91d1": { - "1111-\u5eab\u5b58\u73fe\u91d1": { - "account_type": "Cash" - }, - "1112-\u96f6\u7528\u91d1/\u9031\u8f49\u91d1": { - "account_type": "Cash" - }, - "1113-\u9280\u884c\u5b58\u6b3e": { - "account_type": "Bank", - "\u4e2d\u570b\u4fe1\u8a17": { - "account_type": "Bank" - }, - "\u53f0\u5317\u5bcc\u90a6": { - "account_type": "Bank" - } - }, - "1116-\u5728\u9014\u73fe\u91d1": { - "account_type": "Cash" - }, - "1117-\u7d04\u7576\u73fe\u91d1": { - "account_type": "Cash" - }, - "1118-\u5176\u4ed6\u73fe\u91d1\u53ca\u7d04\u7576\u73fe\u91d1": { - "account_type": "Cash" - }, - "account_type": "Cash" - }, - "112-\u77ed\u671f\u6295\u8cc7": { - "1121-\u77ed\u671f\u6295\u8cc7 \u2014\u80a1\u7968": {} - }, - "113-\u61c9\u6536\u7968\u64da": { - "1131-\u61c9\u6536\u7968\u64da": { - "account_type": "Receivable" - }, - "1132-\u61c9\u6536\u7968\u64da\u8cbc\u73fe ": { - "account_type": "Receivable" - }, - "1138-\u5176\u4ed6\u61c9\u6536\u7968\u64da ": { - "account_type": "Receivable" - }, - "1139-\u5099\u62b5\u5446\u5e33 \uff0d\u61c9\u6536\u7968\u64da ": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "114-\u61c9\u6536\u5e33\u6b3e": { - "1141-\u61c9\u6536\u5e33\u6b3e ": { - "account_type": "Receivable" - }, - "1142-\u61c9\u6536\u5206\u671f\u5e33\u6b3e ": { - "account_type": "Receivable" - }, - "1149-\u5099\u62b5\u5446\u5e33 \uff0d\u61c9\u6536\u5e33\u6b3e ": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "118-\u5176\u4ed6\u61c9\u6536\u6b3e": { - "1184-\u61c9\u6536\u6536\u76ca": { - "account_type": "Receivable" - }, - "1185-\u61c9\u6536\u9000\u7a05\u6b3e": { - "account_type": "Receivable" - }, - "1189-\u5099\u62b5\u5446\u5e33 \u2014 \u5176\u4ed6\u61c9\u6536\u6b3e ": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "121~122-\u5b58\u8ca8": { - "1219-\u5099\u62b5\u5b58\u8ca8\u8dcc\u50f9\u640d\u5931": {}, - "1229-\u5099\u62b5\u5b58\u8ca8\u8dcc\u50f9\u640d\u5931": {}, - "account_type": "Stock", - "is_group": 1 - }, - "125-\u9810\u4ed8\u8cbb\u7528": { - "1251-\u9810\u4ed8\u85aa\u8cc7": {}, - "1252-\u9810\u4ed8\u79df\u91d1": {}, - "1253-\u9810\u4ed8\u4fdd\u96aa\u8cbb": {}, - "1254-\u7528\u54c1\u76e4\u5b58": {}, - "1255-\u9810\u4ed8\u6240\u5f97\u7a05": {}, - "1258-\u5176\u4ed6\u9810\u4ed8\u8cbb\u7528": {} - }, - "126-\u9810\u4ed8\u6b3e\u9805": { - "1261-\u9810\u4ed8\u8ca8\u6b3e": {}, - "1268-\u5176\u4ed6\u9810\u4ed8\u6b3e\u9805": {} - }, - "128~129-\u5176\u4ed6\u6d41\u52d5\u8cc7\u7522": { - "1281-\u9032\u9805\u7a05\u984d": {}, - "1282-\u7559\u62b5\u7a05\u984d": {}, - "1283-\u66ab\u4ed8\u6b3e": {}, - "1284-\u4ee3\u4ed8\u6b3e": {}, - "1285-\u54e1\u5de5\u501f\u652f": {} - } - }, - "13-\u57fa\u91d1\u53ca\u9577\u671f\u6295\u8cc7": { - "131-\u57fa\u91d1": { - "1311-\u511f\u50b5\u57fa\u91d1": {}, - "1313-\u610f\u5916\u640d\u5931\u6e96\u5099\u57fa\u91d1": {}, - "1314-\u9000\u4f11\u57fa\u91d1": {}, - "1318-\u5176\u4ed6\u57fa\u91d1": {} - }, - "132-\u9577\u671f\u6295\u8cc7": { - "1321-\u9577\u671f\u80a1\u6b0a\u6295\u8cc7": {}, - "1322-\u9577\u671f\u50b5\u5238\u6295\u8cc7": {}, - "1323-\u9577\u671f\u4e0d\u52d5\u7522\u6295\u8cc7": {}, - "1328-\u5176\u4ed6\u9577\u671f\u6295\u8cc7": {} - } - }, - "14~15-\u56fa\u5b9a\u8cc7\u7522": { - "141-\u571f\u5730": { - "1411-\u571f\u5730": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "142-\u571f\u5730\u6539\u826f\u7269": { - "1421-\u571f\u5730\u6539\u826f\u7269": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "143-\u623f\u5c4b\u53ca\u5efa\u7269": { - "1431-\u623f\u5c4b\u53ca\u5efa\u7269": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "144~146-\u6a5f(\u5668)\u5177\u53ca\u8a2d\u5099": { - "1441-\u6a5f(\u5668)\u5177": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "151-\u79df\u8cc3\u8cc7\u7522": { - "1511-\u79df\u8cc3\u8cc7\u7522": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "152-\u79df\u8cc3\u6b0a\u76ca\u6539\u826f": { - "1521-\u79df\u8cc3\u6b0a\u76ca\u6539\u826f": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "156-\u672a\u5b8c\u5de5\u7a0b\u53ca\u9810\u4ed8\u8cfc\u7f6e\u8a2d\u5099\u6b3e": { - "1561-\u672a\u5b8c\u5de5\u7a0b": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "158-\u96dc\u9805\u56fa\u5b9a\u8cc7\u7522": { - "1581-\u96dc\u9805\u56fa\u5b9a\u8cc7\u7522": { - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "account_type": "Fixed Asset" - }, - "16-\u905e\u8017\u8cc7\u7522": { - "161-\u905e\u8017\u8cc7\u7522": { - "is_group": 1 - } - }, - "17-\u7121\u5f62\u8cc7\u7522": { - "171-\u5546\u6a19\u6b0a": { - "1711-\u5546\u6a19\u6b0a": {} - }, - "172-\u5c08\u5229\u6b0a": { - "1721-\u5c08\u5229\u6b0a": {} - }, - "176-\u5546\u8b7d": { - "1761-\u5546\u8b7d": {} - }, - "177-\u958b\u8fa6\u8cbb": { - "1771-\u958b\u8fa6\u8cbb": {} - }, - "178-\u5176\u4ed6\u7121\u5f62\u8cc7\u7522": { - "1781-\u905e\u5ef6\u9000\u4f11\u91d1\u6210\u672c": {} - } - }, - "18-\u5176\u4ed6\u8cc7\u7522": { - "181-\u905e\u5ef6\u8cc7\u7522": { - "1811-\u50b5\u5238\u767c\u884c\u6210\u672c": {}, - "1812-\u9577\u671f\u9810\u4ed8\u79df\u91d1": {}, - "1813-\u9577\u671f\u9810\u4ed8\u4fdd\u96aa\u8cbb": {}, - "1814-\u905e\u5ef6\u6240\u5f97\u7a05\u8cc7\u7522": {}, - "1815-\u9810\u4ed8\u9000\u4f11\u91d1": {}, - "1818-\u5176\u4ed6\u905e\u5ef6\u8cc7\u7522": {} - }, - "182-\u9592\u7f6e\u8cc7\u7522": { - "1821-\u9592\u7f6e\u8cc7\u7522": {} - }, - "184-\u9577\u671f\u61c9\u6536\u7968\u64da\u53ca\u6b3e\u9805\u8207\u50ac\u6536\u5e33\u6b3e": { - "1841-\u9577\u671f\u61c9\u6536\u7968\u64da": { - "account_type": "Receivable" - }, - "1842-\u9577\u671f\u61c9\u6536\u5e33\u6b3e": { - "account_type": "Receivable" - }, - "1843-\u50ac\u6536\u5e33\u6b3e": { - "account_type": "Receivable" - }, - "1848-\u5176\u4ed6\u9577\u671f\u61c9\u6536\u6b3e\u9805": { - "account_type": "Receivable" - }, - "1849-\u5099\u62b5\u5446\u5e33\u2014\u9577\u671f\u61c9\u6536\u7968\u64da\u53ca\u6b3e\u9805\u8207\u50ac\u6536\u5e33\u6b3e": { - "account_type": "Receivable" - }, - "account_type": "Receivable" - }, - "185-\u51fa\u79df\u8cc7\u7522": { - "1851-\u51fa\u79df\u8cc7\u7522": {}, - "1858-\u51fa\u79df\u8cc7\u7522 \u2014\u91cd\u4f30\u589e\u503c": {}, - "1859-\u7d2f\u7a4d\u6298\u820a \u2014\u51fa\u79df\u8cc7\u7522": { - "account_type": "Accumulated Depreciation" + "\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca)": { + "account_number": "8", + "root_type": "Expense", + "\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca)": { + "account_number": "81", + "\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca) ": { + "account_number": "811", + "\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca) ": { + "account_number": "8111" } - }, - "186-\u5b58\u51fa\u4fdd\u8b49\u91d1": { - "1861-\u5b58\u51fa\u4fdd\u8b49\u91d1": {} - }, - "188-\u96dc\u9805\u8cc7\u7522": { - "1881-\u53d7\u9650\u5236\u5b58\u6b3e": {}, - "1888-\u96dc\u9805\u8cc7\u7522 \u2014\u5176\u4ed6": {} } - }, + } + }, + "\u696d\u4e3b\u6b0a\u76ca": { + "account_number": "3", + "root_type": "Equity", + "\u4fdd\u7559\u76c8\u9918(\u7d2f\u7a4d\u8667\u640d)": { + "account_number": "33", + "\u672a\u5206\u914d\u76c8\u9918(\u7d2f\u7a4d\u8667\u640d) ": { + "account_number": "335", + "is_group": 1 + }, + "\u6cd5\u5b9a\u76c8\u9918\u516c\u7a4d": { + "account_number": "331", + "\u6cd5\u5b9a\u76c8\u9918\u516c\u7a4d": { + "account_number": "3311" + } + }, + "\u7279\u5225\u76c8\u9918\u516c\u7a4d": { + "account_number": "332", + "\u511f\u50b5\u6e96\u5099": { + "account_number": "3323" + }, + "\u5176\u4ed6\u7279\u5225\u76c8\u9918\u516c\u7a4d": { + "account_number": "3328" + }, + "\u610f\u5916\u640d\u5931\u6e96\u5099": { + "account_number": "3321" + }, + "\u6539\u826f\u64f4\u5145\u6e96\u5099": { + "account_number": "3322" + } + } + }, + "\u5c11\u6578\u80a1\u6b0a": { + "account_number": "36", + "\u5c11\u6578\u80a1\u6b0a": { + "account_number": "361", + "\u5c11\u6578\u80a1\u6b0a": { + "account_number": "3611" + } + } + }, + "\u5eab\u85cf\u80a1": { + "account_number": "35", + "\u5eab\u85cf\u80a1": { + "account_number": "351", + "\u5eab\u85cf\u80a1": { + "account_number": "3511" + } + } + }, + "\u6b0a\u76ca\u8abf\u6574": { + "account_number": "34", + "\u672a\u8a8d\u5217\u70ba\u9000\u4f11\u91d1\u6210\u672c\u4e4b\u6de8\u640d\u5931": { + "account_number": "343", + "\u672a\u8a8d\u5217\u70ba\u9000\u4f11\u91d1\u6210\u672c\u4e4b\u6de8\u640d\u5931": { + "account_number": "3431" + } + }, + "\u7d2f\u7a4d\u63db\u7b97\u8abf\u6574\u6578": { + "account_number": "342", + "\u7d2f\u7a4d\u63db\u7b97\u8abf\u6574\u6578": { + "account_number": "3421" + } + }, + "\u9577\u671f\u80a1\u6b0a\u6295\u8cc7\u672a\u5be6\u73fe\u8dcc\u50f9\u640d\u5931": { + "account_number": "341", + "\u9577\u671f\u80a1\u6b0a\u6295\u8cc7\u672a\u5be6\u73fe\u8dcc\u50f9\u640d\u5931": { + "account_number": "3411" + } + } + }, + "\u8cc7\u672c": { + "account_number": "31", + "\u8cc7\u672c\uff08\u80a1\u672c\uff09 ": { + "account_number": "311", + "\u5f85\u5206\u914d\u80a1\u7968\u80a1\u5229": { + "account_number": "3114" + }, + "\u666e\u901a\u80a1\u80a1\u672c": { + "account_number": "3111" + }, + "\u7279\u5225\u80a1\u80a1\u672c": { + "account_number": "3112" + }, + "\u8cc7\u672c": { + "account_number": "3115" + }, + "\u9810\u6536\u80a1\u672c": { + "account_number": "3113" + } + } + }, + "\u8cc7\u672c\u516c\u7a4d": { + "account_number": "32", + "\u5176\u4ed6\u8cc7\u672c\u516c\u7a4d": { + "account_number": "328", + "\u6b0a\u76ca\u6cd5\u9577\u671f\u80a1\u6b0a\u6295\u8cc7\u8cc7\u672c\u516c\u7a4d": { + "account_number": "3281" + }, + "\u8cc7\u672c\u516c\u7a4d\u2014 \u5eab\u85cf\u80a1\u7968\u4ea4\u6613": { + "account_number": "3282" + } + }, + "\u53d7\u8d08\u516c\u7a4d": { + "account_number": "326", + "\u53d7\u8d08\u516c\u7a4d": { + "account_number": "3261" + } + }, + "\u5408\u4f75\u516c\u7a4d": { + "account_number": "325", + "\u5408\u4f75\u516c\u7a4d": { + "account_number": "3251" + } + }, + "\u80a1\u7968\u6ea2\u50f9": { + "account_number": "321", + "\u666e\u901a\u80a1\u80a1\u7968\u6ea2\u50f9": { + "account_number": "3211" + }, + "\u7279\u5225\u80a1\u80a1\u7968\u6ea2\u50f9": { + "account_number": "3212" + } + }, + "\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u516c\u7a4d": { + "account_number": "324", + "\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u516c\u7a4d": { + "account_number": "3241" + } + }, + "\u8cc7\u7522\u91cd\u4f30\u589e\u503c\u6e96\u5099": { + "account_number": "323", + "\u8cc7\u7522\u91cd\u4f30\u589e\u503c\u6e96\u5099": { + "account_number": "3231" + } + } + } + }, + "\u71df\u696d\u5916\u6536\u5165\u53ca\u8cbb\u7528": { + "account_number": "7", + "root_type": "Income", + "\u71df\u696d\u5916\u6536\u5165": { + "account_number": "71~74", + "\u514c\u63db\u5229\u76ca": { + "account_number": "713", + "\u514c\u63db\u5229\u76ca": { + "account_number": "7131" + } + }, + "\u5176\u4ed6\u71df\u696d\u5916\u6536\u5165": { + "account_number": "748", + "\u4f63\u91d1\u6536\u5165": { + "account_number": "7483" + }, + "\u5176\u4ed6\u71df\u696d\u5916\u6536\u5165\u2014\u5176\u4ed6": { + "account_number": "7488" + }, + "\u51fa\u552e\u4e0b\u8173\u53ca\u5ee2\u6599\u6536\u5165": { + "account_number": "7484" + }, + "\u58de\u5e33\u8f49\u56de\u5229\u76ca": { + "account_number": "7487" + }, + "\u5b58\u8ca8\u76e4\u76c8": { + "account_number": "7485" + }, + "\u5b58\u8ca8\u8dcc\u50f9\u56de\u5347\u5229\u76ca": { + "account_number": "7486" + }, + "\u6350\u8d08\u6536\u5165": { + "account_number": "7481" + }, + "\u79df\u91d1\u6536\u5165": { + "account_number": "7482" + } + }, + "\u5229\u606f\u6536\u5165": { + "account_number": "711", + "\u5229\u606f\u6536\u5165": { + "account_number": "7111" + } + }, + "\u6295\u8cc7\u6536\u76ca": { + "account_number": "712", + "\u6b0a\u76ca\u6cd5\u8a8d\u5217\u4e4b\u6295\u8cc7\u6536\u76ca": { + "account_number": "7121" + }, + "\u77ed\u671f\u6295\u8cc7\u5e02\u50f9\u56de\u5347\u5229\u76ca": { + "account_number": "7123" + }, + "\u80a1\u5229\u6536\u5165": { + "account_number": "7122" + } + }, + "\u8655\u5206\u6295\u8cc7\u6536\u76ca": { + "account_number": "714", + "\u8655\u5206\u6295\u8cc7\u6536\u76ca": { + "account_number": "7141" + } + }, + "\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u6536\u5165": { + "account_number": "715", + "\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u6536\u5165": { + "account_number": "7151" + } + } + }, + "\u71df\u696d\u5916\u8cbb\u7528": { + "account_number": "75~78", + "\u514c\u63db\u640d\u5931": { + "account_number": "753", + "\u514c\u63db\u640d\u5931": { + "account_number": "7531" + } + }, + "\u5176\u4ed6\u71df\u696d\u5916\u8cbb\u7528": { + "account_number": "788", + "\u505c\u5de5\u640d\u5931": { + "account_number": "7881" + }, + "\u5176\u4ed6\u71df\u696d\u5916\u8cbb\u7528\u2014\u5176\u4ed6": { + "account_number": "7888" + }, + "\u5b58\u8ca8\u76e4\u640d": { + "account_number": "7885" + }, + "\u5b58\u8ca8\u8dcc\u50f9\u53ca\u5446\u6eef\u640d\u5931": { + "account_number": "7886" + }, + "\u707d\u5bb3\u640d\u5931": { + "account_number": "7882" + } + }, + "\u5229\u606f\u8cbb\u7528": { + "account_number": "751", + "\u5229\u606f\u8cbb\u7528": { + "account_number": "7511" + } + }, + "\u6295\u8cc7\u640d\u5931": { + "account_number": "752", + "\u6b0a\u76ca\u6cd5\u8a8d\u5217\u4e4b\u6295\u8cc7\u640d\u5931": { + "account_number": "7521" + }, + "\u77ed\u671f\u6295\u8cc7\u672a\u5be6\u73fe\u8dcc\u50f9\u640d\u5931": { + "account_number": "7523" + } + }, + "\u8655\u5206\u6295\u8cc7\u640d\u5931": { + "account_number": "754", + "\u8655\u5206\u6295\u8cc7\u640d\u5931": { + "account_number": "7541" + } + }, + "\u8655\u5206\u8cc7\u7522\u640d\u5931": { + "account_number": "755", + "\u8655\u5206\u8cc7\u7522\u640d\u5931 ": { + "account_number": "7551" + } + } + } + }, + "\u71df\u696d\u6210\u672c": { + "Stock Adjustment": { + "account_type": "Stock Adjustment" + }, + "account_number": "5", + "root_type": "Expense", + "\u5176\u4ed6\u71df\u696d\u6210\u672c": { + "account_number": "58", + "\u5176\u4ed6\u71df\u696d\u6210\u672c\u2014\u5176\u4ed6 ": { + "account_number": "588", + "\u5176\u4ed6\u71df\u696d\u6210\u672c\u2014\u5176\u4ed6": { + "account_number": "5888" + } + } + }, + "\u52de\u52d9\u6210\u672c\u88fd": { + "account_number": "56", + "\u52de\u52d9\u6210\u672c": { + "account_number": "561", + "\u52de\u52d9\u6210\u672c": { + "account_number": "5611" + } + } + }, + "\u696d\u52d9\u6210\u672c": { + "account_number": "57", + "\u696d\u52d9\u6210\u672c": { + "account_number": "571", + "\u696d\u52d9\u6210\u672c": { + "account_number": "5711" + } + } + }, + "\u92b7\u8ca8\u6210\u672c": { + "Expenses Included In Valuation": { + "account_type": "Expenses Included In Valuation" + }, + "account_number": "51", + "account_type": "Cost of Goods Sold", + "\u76f4\u63a5\u4eba\u5de5": { + "account_number": "514", + "\u76f4\u63a5\u4eba\u5de5": { + "account_number": "5141" + } + }, + "\u88fd\u9020\u8cbb\u7528": { + "account_number": "515~518", + "\u4f19\u98df\u8cbb": { + "account_number": "5172" + }, + "\u4fdd\u96aa\u8cbb": { + "account_number": "5162" + }, + "\u4fee\u7e55\u8cbb": { + "account_number": "5157" + }, + "\u5176\u4ed6\u88fd\u9020\u8cbb\u7528": { + "account_number": "5188" + }, + "\u52a0\u5de5\u8cbb": { + "account_number": "5163" + }, + "\u5305\u88dd\u8cbb": { + "account_number": "5158" + }, + "\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": { + "account_number": "5169" + }, + "\u6298\u820a ": { + "account_number": "5168", + "account_type": "Depreciation" + }, + "\u6587\u5177\u7528\u54c1": { + "account_number": "5153" + }, + "\u65c5\u8cbb": { + "account_number": "5154" + }, + "\u6c34\u96fb\u74e6\u65af\u8cbb": { + "account_number": "5161" + }, + "\u79df\u91d1\u652f\u51fa": { + "account_number": "5152" + }, + "\u7a05\u6350": { + "account_number": "5166", + "account_type": "Tax", + "tax_rate": 5.0 + }, + "\u8077\u5de5\u798f\u5229": { + "account_number": "5173" + }, + "\u8a13\u7df4\u8cbb": { + "account_number": "5176" + }, + "\u904b\u8cbb": { + "account_number": "5155" + }, + "\u90f5\u96fb\u8cbb": { + "account_number": "5156" + }, + "\u9593\u63a5\u4eba\u5de5": { + "account_number": "5151" + }, + "\u9593\u63a5\u6750\u6599": { + "account_number": "5177" + } + }, + "\u9032\u6599": { + "account_number": "513", + "\u9032\u6599": { + "account_number": "5131" + }, + "\u9032\u6599\u6298\u8b93": { + "account_number": "5134" + }, + "\u9032\u6599\u8cbb\u7528": { + "account_number": "5132" + }, + "\u9032\u6599\u9000\u51fa": { + "account_number": "5133" + } + }, + "\u9032\u8ca8": { + "account_number": "512", + "\u9032\u8ca8": { + "account_number": "5121" + }, + "\u9032\u8ca8\u6298\u8b93": { + "account_number": "5124" + }, + "\u9032\u8ca8\u8cbb\u7528": { + "account_number": "5122" + }, + "\u9032\u8ca8\u9000\u51fa": { + "account_number": "5123" + } + }, + "\u92b7\u8ca8\u6210\u672c": { + "account_number": "511", + "account_type": "Cost of Goods Sold", + "\u5206\u671f\u4ed8\u6b3e\u92b7\u8ca8\u6210\u672c": { + "account_number": "5112", + "account_type": "Cost of Goods Sold" + }, + "\u92b7\u8ca8\u6210\u672c": { + "account_number": "5111", + "account_type": "Cost of Goods Sold" + } + } + } + }, + "\u71df\u696d\u6536\u5165": { + "account_number": "4", + "root_type": "Income", + "\u5176\u4ed6\u71df\u696d\u6536\u5165": { + "account_number": "48", + "\u5176\u4ed6\u71df\u696d\u6536\u5165\u2014\u5176\u4ed6": { + "account_number": "488", + "\u5176\u4ed6\u71df\u696d\u6536\u5165\u2014\u5176\u4ed6": { + "account_number": "4888" + } + } + }, + "\u52de\u52d9\u6536\u5165": { + "account_number": "46", + "\u52de\u52d9\u6536\u5165": { + "account_number": "461", + "\u52de\u52d9\u6536\u5165": { + "account_number": "4611" + } + } + }, + "\u696d\u52d9\u6536\u5165": { + "account_number": "47", + "\u696d\u52d9\u6536\u5165": { + "account_number": "471", + "\u696d\u52d9\u6536\u5165": { + "account_number": "4711" + } + } + }, + "\u92b7\u8ca8\u6536\u5165": { + "account_number": "41", + "\u92b7\u8ca8\u6298\u8b93": { + "account_number": "419", + "\u92b7\u8ca8\u6298\u8b93": { + "account_number": "4191" + } + }, + "\u92b7\u8ca8\u6536\u5165": { + "account_number": "411", + "\u5206\u671f\u4ed8\u6b3e\u92b7\u8ca8\u6536\u5165": { + "account_number": "4112" + }, + "\u92b7\u8ca8\u6536\u5165": { + "account_number": "4111" + } + }, + "\u92b7\u8ca8\u9000\u56de": { + "account_number": "417", + "\u92b7\u8ca8\u9000\u56de": { + "account_number": "4171" + } + } + } + }, + "\u71df\u696d\u8cbb\u7528": { + "account_number": "6", + "root_type": "Expense", + "\u63a8\u92b7\u8cbb\u7528": { + "account_number": "61", + "\u63a8\u92b7\u8cbb\u7528": { + "account_number": "615~618", + "\u4ea4\u969b\u8cbb": { + "account_number": "6164" + }, + "\u4f19\u98df\u8cbb": { + "account_number": "6172" + }, + "\u4f63\u91d1\u652f\u51fa": { + "account_number": "6175" + }, + "\u4fdd\u96aa\u8cbb": { + "account_number": "6162" + }, + "\u4fee\u7e55\u8cbb": { + "account_number": "6157" + }, + "\u5176\u4ed6\u63a8\u92b7\u8cbb\u7528": { + "account_number": "6188" + }, + "\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": { + "account_number": "6169" + }, + "\u5446\u5e33\u640d\u5931": { + "account_number": "6167" + }, + "\u5ee3\u544a\u8cbb": { + "account_number": "6159" + }, + "\u6298\u820a ": { + "account_number": "6168", + "account_type": "Depreciation" + }, + "\u6350\u8d08": { + "account_number": "6165" + }, + "\u6587\u5177\u7528\u54c1": { + "account_number": "6153" + }, + "\u65c5\u8cbb": { + "account_number": "6154" + }, + "\u6c34\u96fb\u74e6\u65af\u8cbb": { + "account_number": "6161" + }, + "\u79df\u91d1\u652f\u51fa": { + "account_number": "6152" + }, + "\u7a05\u6350": { + "account_number": "6166", + "account_type": "Tax", + "tax_rate": 5.0 + }, + "\u8077\u5de5\u798f\u5229": { + "account_number": "6173" + }, + "\u85aa\u8cc7\u652f\u51fa": { + "account_number": "6151" + }, + "\u8a13\u7df4\u8cbb": { + "account_number": "6176" + }, + "\u904b\u8cbb": { + "account_number": "6155" + }, + "\u90f5\u96fb\u8cbb": { + "account_number": "6156" + } + } + }, + "\u7814\u7a76\u767c\u5c55\u8cbb\u7528": { + "account_number": "63", + "\u7814\u7a76\u767c\u5c55\u8cbb\u7528": { + "account_number": "635~638", + "\u4ea4\u969b\u8cbb": { + "account_number": "6364" + }, + "\u4f19\u98df\u8cbb": { + "account_number": "6372" + }, + "\u4fdd\u96aa\u8cbb": { + "account_number": "6362" + }, + "\u4fee\u7e55\u8cbb": { + "account_number": "6357" + }, + "\u5176\u4ed6\u7814\u7a76\u767c\u5c55\u8cbb\u7528": { + "account_number": "6378" + }, + "\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": { + "account_number": "6369" + }, + "\u6298\u820a": { + "account_number": "6368", + "account_type": "Depreciation" + }, + "\u6587\u5177\u7528\u54c1": { + "account_number": "6353" + }, + "\u65c5\u8cbb": { + "account_number": "6354" + }, + "\u6c34\u96fb\u74e6\u65af\u8cbb": { + "account_number": "6361" + }, + "\u79df\u91d1\u652f\u51fa": { + "account_number": "6352" + }, + "\u7a05\u6350": { + "account_number": "6366", + "account_type": "Tax", + "tax_rate": 5.0 + }, + "\u8077\u5de5\u798f\u5229": { + "account_number": "6373" + }, + "\u85aa\u8cc7\u652f\u51fa": { + "account_number": "6351" + }, + "\u8a13\u7df4\u8cbb": { + "account_number": "6376" + }, + "\u904b\u8cbb": { + "account_number": "6355" + }, + "\u90f5\u96fb\u8cbb": { + "account_number": "6356" + } + } + }, + "\u7ba1\u7406\u53ca\u7e3d\u52d9\u8cbb\u7528": { + "account_number": "62", + "\u7ba1\u7406\u53ca\u7e3d\u52d9\u8cbb\u7528": { + "account_number": "625~628", + "\u4ea4\u969b\u8cbb": { + "account_number": "6264" + }, + "\u4f19\u98df\u8cbb": { + "account_number": "6272" + }, + "\u4f63\u91d1\u652f\u51fa": { + "account_number": "6275" + }, + "\u4fdd\u96aa\u8cbb": { + "account_number": "6262" + }, + "\u4fee\u7e55\u8cbb": { + "account_number": "6257" + }, + "\u5176\u4ed6\u7ba1\u7406\u53ca\u7e3d\u52d9\u8cbb\u7528": { + "account_number": "6288" + }, + "\u52de\u52d9\u8cbb": { + "account_number": "6278" + }, + "\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": { + "account_number": "6269" + }, + "\u5446\u5e33\u640d\u5931": { + "account_number": "6267" + }, + "\u5916\u92b7\u640d\u5931": { + "account_number": "6271" + }, + "\u5ee3\u544a\u8cbb": { + "account_number": "6259" + }, + "\u6298\u820a": { + "account_number": "6268", + "account_type": "Depreciation" + }, + "\u6350\u8d08": { + "account_number": "6265" + }, + "\u6587\u5177\u7528\u54c1": { + "account_number": "6253" + }, + "\u65c5\u8cbb": { + "account_number": "6254" + }, + "\u6c34\u96fb\u74e6\u65af\u8cbb": { + "account_number": "6261" + }, + "\u7814\u7a76\u767c\u5c55\u8cbb\u7528": { + "account_number": "6274" + }, + "\u79df\u91d1\u652f\u51fa": { + "account_number": "6252" + }, + "\u7a05\u6350": { + "account_number": "6266", + "account_type": "Tax", + "tax_rate": 5.0 + }, + "\u8077\u5de5\u798f\u5229": { + "account_number": "6273" + }, + "\u85aa\u8cc7\u652f\u51fa": { + "account_number": "6251" + }, + "\u8a13\u7df4\u8cbb": { + "account_number": "6276" + }, + "\u904b\u8cbb": { + "account_number": "6255" + }, + "\u90f5\u96fb\u8cbb": { + "account_number": "6256" + } + } + } + }, + "\u8ca0\u50b5": { + "Stock Received But Not Billed": { + "account_type": "Stock Received But Not Billed" + }, + "account_number": "2", + "root_type": "Liability", + "\u5176\u4ed6\u8ca0\u50b5": { + "account_number": "28", + "\u5b58\u5165\u4fdd\u8b49\u91d1": { + "account_number": "286", + "\u5b58\u5165\u4fdd\u8b49\u91d1": { + "account_number": "2861" + } + }, + "\u905e\u5ef6\u8ca0\u50b5": { + "account_number": "281", + "\u5176\u4ed6\u905e\u5ef6\u8ca0\u50b5": { + "account_number": "2818" + }, + "\u905e\u5ef6\u6240\u5f97\u7a05\u8ca0\u50b5": { + "account_number": "2814" + }, + "\u905e\u5ef6\u6536\u5165": { + "account_number": "2811" + } + }, + "\u96dc\u9805\u8ca0\u50b5": { + "account_number": "288", + "\u96dc\u9805\u8ca0\u50b5 \u2014\u5176\u4ed6": { + "account_number": "2888" + } + } + }, + "\u6d41\u52d5\u8ca0\u50b5": { + "account_number": "21~22", + "\u4e00\u5e74\u6216\u4e00\u71df\u696d\u9031\u671f\u5167\u5230\u671f\u9577\u671f\u8ca0\u50b5": { + "account_number": "227", + "is_group": 1 + }, + "\u5176\u4ed6\u61c9\u4ed8\u6b3e": { + "account_number": "218~219", + "\u61c9\u4ed8\u571f\u5730\u623f\u5c4b\u6b3e": { + "account_number": "2184" + }, + "\u61c9\u4ed8\u80a1\u5229": { + "account_number": "2192" + }, + "\u61c9\u4ed8\u8a2d\u5099\u6b3e": { + "account_number": "2185" + } + }, + "\u5176\u4ed6\u6d41\u52d5\u8ca0\u50b5": { + "account_number": "228~229", + "\u4ee3\u6536\u6b3e": { + "account_number": "2284" + }, + "\u4f30\u8a08\u552e\u5f8c\u670d\u52d9/\u4fdd\u56fa\u8ca0\u50b5": { + "account_number": "2285" + }, + "\u66ab\u6536\u6b3e ": { + "account_number": "2283" + }, + "\u905e\u5ef6\u514c\u63db\u5229\u76ca": { + "account_number": "2292" + }, + "\u905e\u5ef6\u6240\u5f97\u7a05\u8ca0\u50b5": { + "account_number": "2291" + }, + "\u92b7\u9805\u7a05\u984d": { + "account_number": "2281" + } + }, + "\u61c9\u4ed8\u5e33\u6b3e": { + "account_number": "214", + "account_type": "Payable", + "\u61c9\u4ed8\u5e33\u6b3e": { + "account_number": "2141", + "account_type": "Payable" + } + }, + "\u61c9\u4ed8\u6240\u5f97\u7a05": { + "account_number": "216", + "account_type": "Tax", + "tax_rate": 5.0, + "\u61c9\u4ed8\u6240\u5f97\u7a05": { + "account_number": "2161", + "account_type": "Tax", + "tax_rate": 5.0 + } + }, + "\u61c9\u4ed8\u77ed\u671f\u7968\u5238": { + "account_number": "212", + "account_type": "Payable", + "\u61c9\u4ed8\u5546\u696d\u672c\u7968": { + "account_number": "2121", + "account_type": "Payable" + }, + "\u9280\u884c\u627f\u514c\u532f\u7968": { + "account_number": "2122", + "account_type": "Payable" + } + }, + "\u61c9\u4ed8\u7968\u64da": { + "account_number": "213", + "account_type": "Payable", + "\u61c9\u4ed8\u7968\u64da": { + "account_number": "2131", + "account_type": "Payable" + } + }, + "\u61c9\u4ed8\u8cbb\u7528": { + "account_number": "217", + "\u5176\u4ed6\u61c9\u4ed8\u8cbb\u7528": { + "account_number": "2178" + }, + "\u61c9\u4ed8\u5229\u606f": { + "account_number": "2173" + }, + "\u61c9\u4ed8\u71df\u696d\u7a05": { + "account_number": "2174" + }, + "\u61c9\u4ed8\u79df\u91d1": { + "account_number": "2172" + }, + "\u61c9\u4ed8\u7a05\u6350 \u2014\u5176\u4ed6": { + "account_number": "2175", + "account_type": "Tax", + "tax_rate": 5.0 + }, + "\u61c9\u4ed8\u85aa\u5de5": { + "account_number": "2171" + } + }, + "\u77ed\u671f\u501f\u6b3e": { + "account_number": "211", + "\u9280\u884c\u501f\u6b3e": { + "account_number": "2112" + }, + "\u9280\u884c\u900f\u652f": { + "account_number": "2111" + } + }, + "\u9810\u6536\u6b3e\u9805": { + "account_number": "226", + "\u5176\u4ed6\u9810\u6536\u6b3e": { + "account_number": "2268" + }, + "\u9810\u6536\u6536\u5165": { + "account_number": "2262" + }, + "\u9810\u6536\u8ca8\u6b3e": { + "account_number": "2261" + } + } + }, + "\u9577\u671f\u8ca0\u50b5": { + "account_number": "23", + "\u4f30\u8a08\u61c9\u4ed8\u571f\u5730\u589e\u503c\u7a05": { + "account_number": "234", + "\u4f30\u8a08\u61c9\u4ed8\u571f\u5730\u589e\u503c\u7a05": { + "account_number": "2341" + } + }, + "\u5176\u4ed6\u9577\u671f\u8ca0\u50b5": { + "account_number": "238", + "\u5176\u4ed6\u9577\u671f\u8ca0\u50b5\u2014\u5176\u4ed6": { + "account_number": "2388" + } + }, + "\u61c9\u4ed8\u516c\u53f8\u50b5": { + "account_number": "231", + "\u61c9\u4ed8\u516c\u53f8\u50b5": { + "account_number": "2311" + }, + "\u61c9\u4ed8\u516c\u53f8\u50b5\u6ea2(\u6298)\u50f9": { + "account_number": "2319" + } + }, + "\u61c9\u8a08\u9000\u4f11\u91d1\u8ca0\u50b5": { + "account_number": "235", + "\u61c9\u8a08\u9000\u4f11\u91d1\u8ca0\u50b5": { + "account_number": "2351" + } + }, + "\u9577\u671f\u501f\u6b3e": { + "account_number": "232", + "\u9577\u671f\u501f\u6b3e \u2014\u5176\u4ed6": { + "account_number": "2328" + }, + "\u9577\u671f\u501f\u6b3e \u2014\u54e1\u5de5": { + "account_number": "2325" + }, + "\u9577\u671f\u501f\u6b3e \u2014\u696d\u4e3b": { + "account_number": "2324" + }, + "\u9577\u671f\u501f\u6b3e \u2014\u95dc\u4fc2\u4eba": { + "account_number": "2327" + }, + "\u9577\u671f\u9280\u884c\u501f\u6b3e": { + "account_number": "2321" + } + }, + "\u9577\u671f\u61c9\u4ed8\u7968\u64da\u53ca\u6b3e\u9805": { + "account_number": "233", + "account_type": "Payable", + "\u9577\u671f\u61c9\u4ed8\u5e33\u6b3e": { + "account_number": "2332", + "account_type": "Payable" + }, + "\u9577\u671f\u61c9\u4ed8\u7968\u64da": { + "account_number": "2331", + "account_type": "Payable" + }, + "\u9577\u671f\u61c9\u4ed8\u79df\u8cc3\u8ca0\u50b5": { + "account_number": "2333", + "account_type": "Payable" + } + } + } + }, + "\u8cc7\u7522": { "Temporary Accounts": { "Temporary Opening": { "account_type": "Temporary" - }, + }, "account_type": "Temporary" - }, - "root_type": "Asset" - }, - "2-\u8ca0\u50b5": { - "21~22-\u6d41\u52d5\u8ca0\u50b5": { - "211-\u77ed\u671f\u501f\u6b3e": { - "2111-\u9280\u884c\u900f\u652f": {}, - "2112-\u9280\u884c\u501f\u6b3e": {} - }, - "212-\u61c9\u4ed8\u77ed\u671f\u7968\u5238": { - "2121-\u61c9\u4ed8\u5546\u696d\u672c\u7968": { - "account_type": "Payable" - }, - "2122-\u9280\u884c\u627f\u514c\u532f\u7968": { - "account_type": "Payable" - }, - "account_type": "Payable" - }, - "213-\u61c9\u4ed8\u7968\u64da": { - "2131-\u61c9\u4ed8\u7968\u64da": { - "account_type": "Payable" - }, - "account_type": "Payable" - }, - "214-\u61c9\u4ed8\u5e33\u6b3e": { - "2141-\u61c9\u4ed8\u5e33\u6b3e": { - "account_type": "Payable" - }, - "account_type": "Payable" - }, - "216-\u61c9\u4ed8\u6240\u5f97\u7a05": { - "2161-\u61c9\u4ed8\u6240\u5f97\u7a05": { - "account_type": "Tax", - "tax_rate": 5.0 - }, - "account_type": "Tax", - "tax_rate": 5.0 - }, - "217-\u61c9\u4ed8\u8cbb\u7528": { - "2171-\u61c9\u4ed8\u85aa\u5de5": {}, - "2172-\u61c9\u4ed8\u79df\u91d1": {}, - "2173-\u61c9\u4ed8\u5229\u606f": {}, - "2174-\u61c9\u4ed8\u71df\u696d\u7a05": {}, - "2175-\u61c9\u4ed8\u7a05\u6350 \u2014\u5176\u4ed6": { - "account_type": "Tax", - "tax_rate": 5.0 - }, - "2178-\u5176\u4ed6\u61c9\u4ed8\u8cbb\u7528": {} - }, - "218~219-\u5176\u4ed6\u61c9\u4ed8\u6b3e": { - "2184-\u61c9\u4ed8\u571f\u5730\u623f\u5c4b\u6b3e": {}, - "2185-\u61c9\u4ed8\u8a2d\u5099\u6b3e": {}, - "2192-\u61c9\u4ed8\u80a1\u5229": {} - }, - "226-\u9810\u6536\u6b3e\u9805": { - "2261-\u9810\u6536\u8ca8\u6b3e": {}, - "2262-\u9810\u6536\u6536\u5165": {}, - "2268-\u5176\u4ed6\u9810\u6536\u6b3e": {} - }, - "227-\u4e00\u5e74\u6216\u4e00\u71df\u696d\u9031\u671f\u5167\u5230\u671f\u9577\u671f\u8ca0\u50b5": { - "is_group": 1 - }, - "228~229-\u5176\u4ed6\u6d41\u52d5\u8ca0\u50b5": { - "2281-\u92b7\u9805\u7a05\u984d": {}, - "2283-\u66ab\u6536\u6b3e ": {}, - "2284-\u4ee3\u6536\u6b3e": {}, - "2285-\u4f30\u8a08\u552e\u5f8c\u670d\u52d9/\u4fdd\u56fa\u8ca0\u50b5": {}, - "2291-\u905e\u5ef6\u6240\u5f97\u7a05\u8ca0\u50b5": {}, - "2292-\u905e\u5ef6\u514c\u63db\u5229\u76ca": {} + }, + "account_number": "1", + "root_type": "Asset", + "\u5176\u4ed6\u8cc7\u7522": { + "account_number": "18", + "\u51fa\u79df\u8cc7\u7522": { + "account_number": "185", + "\u51fa\u79df\u8cc7\u7522": { + "account_number": "1851" + }, + "\u51fa\u79df\u8cc7\u7522 \u2014\u91cd\u4f30\u589e\u503c": { + "account_number": "1858" + }, + "\u7d2f\u7a4d\u6298\u820a \u2014\u51fa\u79df\u8cc7\u7522": { + "account_number": "1859", + "account_type": "Accumulated Depreciation" + } + }, + "\u5b58\u51fa\u4fdd\u8b49\u91d1": { + "account_number": "186", + "\u5b58\u51fa\u4fdd\u8b49\u91d1": { + "account_number": "1861" + } + }, + "\u905e\u5ef6\u8cc7\u7522": { + "account_number": "181", + "\u50b5\u5238\u767c\u884c\u6210\u672c": { + "account_number": "1811" + }, + "\u5176\u4ed6\u905e\u5ef6\u8cc7\u7522": { + "account_number": "1818" + }, + "\u905e\u5ef6\u6240\u5f97\u7a05\u8cc7\u7522": { + "account_number": "1814" + }, + "\u9577\u671f\u9810\u4ed8\u4fdd\u96aa\u8cbb": { + "account_number": "1813" + }, + "\u9577\u671f\u9810\u4ed8\u79df\u91d1": { + "account_number": "1812" + }, + "\u9810\u4ed8\u9000\u4f11\u91d1": { + "account_number": "1815" + } + }, + "\u9577\u671f\u61c9\u6536\u7968\u64da\u53ca\u6b3e\u9805\u8207\u50ac\u6536\u5e33\u6b3e": { + "account_number": "184", + "account_type": "Receivable", + "\u5099\u62b5\u5446\u5e33\u2014\u9577\u671f\u61c9\u6536\u7968\u64da\u53ca\u6b3e\u9805\u8207\u50ac\u6536\u5e33\u6b3e": { + "account_number": "1849", + "account_type": "Receivable" + }, + "\u50ac\u6536\u5e33\u6b3e": { + "account_number": "1843", + "account_type": "Receivable" + }, + "\u5176\u4ed6\u9577\u671f\u61c9\u6536\u6b3e\u9805": { + "account_number": "1848", + "account_type": "Receivable" + }, + "\u9577\u671f\u61c9\u6536\u5e33\u6b3e": { + "account_number": "1842", + "account_type": "Receivable" + }, + "\u9577\u671f\u61c9\u6536\u7968\u64da": { + "account_number": "1841", + "account_type": "Receivable" + } + }, + "\u9592\u7f6e\u8cc7\u7522": { + "account_number": "182", + "\u9592\u7f6e\u8cc7\u7522": { + "account_number": "1821" + } + }, + "\u96dc\u9805\u8cc7\u7522": { + "account_number": "188", + "\u53d7\u9650\u5236\u5b58\u6b3e": { + "account_number": "1881" + }, + "\u96dc\u9805\u8cc7\u7522 \u2014\u5176\u4ed6": { + "account_number": "1888" + } } - }, - "23-\u9577\u671f\u8ca0\u50b5": { - "231-\u61c9\u4ed8\u516c\u53f8\u50b5": { - "2311-\u61c9\u4ed8\u516c\u53f8\u50b5": {}, - "2319-\u61c9\u4ed8\u516c\u53f8\u50b5\u6ea2(\u6298)\u50f9": {} - }, - "232-\u9577\u671f\u501f\u6b3e": { - "2321-\u9577\u671f\u9280\u884c\u501f\u6b3e": {}, - "2324-\u9577\u671f\u501f\u6b3e \u2014\u696d\u4e3b": {}, - "2325-\u9577\u671f\u501f\u6b3e \u2014\u54e1\u5de5": {}, - "2327-\u9577\u671f\u501f\u6b3e \u2014\u95dc\u4fc2\u4eba": {}, - "2328-\u9577\u671f\u501f\u6b3e \u2014\u5176\u4ed6": {} - }, - "233-\u9577\u671f\u61c9\u4ed8\u7968\u64da\u53ca\u6b3e\u9805": { - "2331-\u9577\u671f\u61c9\u4ed8\u7968\u64da": { - "account_type": "Payable" - }, - "2332-\u9577\u671f\u61c9\u4ed8\u5e33\u6b3e": { - "account_type": "Payable" - }, - "2333-\u9577\u671f\u61c9\u4ed8\u79df\u8cc3\u8ca0\u50b5": { - "account_type": "Payable" - }, - "account_type": "Payable" - }, - "234-\u4f30\u8a08\u61c9\u4ed8\u571f\u5730\u589e\u503c\u7a05": { - "2341-\u4f30\u8a08\u61c9\u4ed8\u571f\u5730\u589e\u503c\u7a05": {} - }, - "235-\u61c9\u8a08\u9000\u4f11\u91d1\u8ca0\u50b5": { - "2351-\u61c9\u8a08\u9000\u4f11\u91d1\u8ca0\u50b5": {} - }, - "238-\u5176\u4ed6\u9577\u671f\u8ca0\u50b5": { - "2388-\u5176\u4ed6\u9577\u671f\u8ca0\u50b5\u2014\u5176\u4ed6": {} + }, + "\u56fa\u5b9a\u8cc7\u7522": { + "account_number": "14~15", + "account_type": "Fixed Asset", + "\u571f\u5730": { + "account_number": "141", + "account_type": "Fixed Asset", + "\u571f\u5730": { + "account_number": "1411", + "account_type": "Fixed Asset" + } + }, + "\u571f\u5730\u6539\u826f\u7269": { + "account_number": "142", + "account_type": "Fixed Asset", + "\u571f\u5730\u6539\u826f\u7269": { + "account_number": "1421", + "account_type": "Fixed Asset" + } + }, + "\u623f\u5c4b\u53ca\u5efa\u7269": { + "account_number": "143", + "account_type": "Fixed Asset", + "\u623f\u5c4b\u53ca\u5efa\u7269": { + "account_number": "1431", + "account_type": "Fixed Asset" + } + }, + "\u672a\u5b8c\u5de5\u7a0b\u53ca\u9810\u4ed8\u8cfc\u7f6e\u8a2d\u5099\u6b3e": { + "account_number": "156", + "account_type": "Fixed Asset", + "\u672a\u5b8c\u5de5\u7a0b": { + "account_number": "1561", + "account_type": "Fixed Asset" + } + }, + "\u6a5f(\u5668)\u5177\u53ca\u8a2d\u5099": { + "account_number": "144~146", + "account_type": "Fixed Asset", + "\u6a5f(\u5668)\u5177": { + "account_number": "1441", + "account_type": "Fixed Asset" + } + }, + "\u79df\u8cc3\u6b0a\u76ca\u6539\u826f": { + "account_number": "152", + "account_type": "Fixed Asset", + "\u79df\u8cc3\u6b0a\u76ca\u6539\u826f": { + "account_number": "1521", + "account_type": "Fixed Asset" + } + }, + "\u79df\u8cc3\u8cc7\u7522": { + "account_number": "151", + "account_type": "Fixed Asset", + "\u79df\u8cc3\u8cc7\u7522": { + "account_number": "1511", + "account_type": "Fixed Asset" + } + }, + "\u96dc\u9805\u56fa\u5b9a\u8cc7\u7522": { + "account_number": "158", + "account_type": "Fixed Asset", + "\u96dc\u9805\u56fa\u5b9a\u8cc7\u7522": { + "account_number": "1581", + "account_type": "Fixed Asset" + } } - }, - "28-\u5176\u4ed6\u8ca0\u50b5": { - "281-\u905e\u5ef6\u8ca0\u50b5": { - "2811-\u905e\u5ef6\u6536\u5165": {}, - "2814-\u905e\u5ef6\u6240\u5f97\u7a05\u8ca0\u50b5": {}, - "2818-\u5176\u4ed6\u905e\u5ef6\u8ca0\u50b5": {} - }, - "286-\u5b58\u5165\u4fdd\u8b49\u91d1": { - "2861-\u5b58\u5165\u4fdd\u8b49\u91d1": {} - }, - "288-\u96dc\u9805\u8ca0\u50b5": { - "2888-\u96dc\u9805\u8ca0\u50b5 \u2014\u5176\u4ed6": {} + }, + "\u57fa\u91d1\u53ca\u9577\u671f\u6295\u8cc7": { + "account_number": "13", + "\u57fa\u91d1": { + "account_number": "131", + "\u511f\u50b5\u57fa\u91d1": { + "account_number": "1311" + }, + "\u5176\u4ed6\u57fa\u91d1": { + "account_number": "1318" + }, + "\u610f\u5916\u640d\u5931\u6e96\u5099\u57fa\u91d1": { + "account_number": "1313" + }, + "\u9000\u4f11\u57fa\u91d1": { + "account_number": "1314" + } + }, + "\u9577\u671f\u6295\u8cc7": { + "account_number": "132", + "\u5176\u4ed6\u9577\u671f\u6295\u8cc7": { + "account_number": "1328" + }, + "\u9577\u671f\u4e0d\u52d5\u7522\u6295\u8cc7": { + "account_number": "1323" + }, + "\u9577\u671f\u50b5\u5238\u6295\u8cc7": { + "account_number": "1322" + }, + "\u9577\u671f\u80a1\u6b0a\u6295\u8cc7": { + "account_number": "1321" + } } - }, - "Stock Received But Not Billed": { - "account_type": "Stock Received But Not Billed" - }, - "root_type": "Liability" - }, - "3-\u696d\u4e3b\u6b0a\u76ca": { - "31-\u8cc7\u672c": { - "311-\u8cc7\u672c\uff08\u80a1\u672c\uff09 ": { - "3111-\u666e\u901a\u80a1\u80a1\u672c": {}, - "3112-\u7279\u5225\u80a1\u80a1\u672c": {}, - "3113-\u9810\u6536\u80a1\u672c": {}, - "3114-\u5f85\u5206\u914d\u80a1\u7968\u80a1\u5229": {}, - "3115-\u8cc7\u672c": {} + }, + "\u6d41\u52d5\u8cc7\u7522": { + "account_number": "11~12", + "\u5176\u4ed6\u61c9\u6536\u6b3e": { + "account_number": "118", + "account_type": "Receivable", + "\u5099\u62b5\u5446\u5e33 \u2014 \u5176\u4ed6\u61c9\u6536\u6b3e ": { + "account_number": "1189", + "account_type": "Receivable" + }, + "\u61c9\u6536\u6536\u76ca": { + "account_number": "1184", + "account_type": "Receivable" + }, + "\u61c9\u6536\u9000\u7a05\u6b3e": { + "account_number": "1185", + "account_type": "Receivable" + } + }, + "\u5176\u4ed6\u6d41\u52d5\u8cc7\u7522": { + "account_number": "128~129", + "\u4ee3\u4ed8\u6b3e": { + "account_number": "1284" + }, + "\u54e1\u5de5\u501f\u652f": { + "account_number": "1285" + }, + "\u66ab\u4ed8\u6b3e": { + "account_number": "1283" + }, + "\u7559\u62b5\u7a05\u984d": { + "account_number": "1282" + }, + "\u9032\u9805\u7a05\u984d": { + "account_number": "1281" + } + }, + "\u5b58\u8ca8": { + "account_number": "121~122", + "account_type": "Stock", + "is_group": 1, + "\u5099\u62b5\u5b58\u8ca8\u8dcc\u50f9\u640d\u5931": { + "account_number": "1229" + } + }, + "\u61c9\u6536\u5e33\u6b3e": { + "account_number": "114", + "account_type": "Receivable", + "\u5099\u62b5\u5446\u5e33 \uff0d\u61c9\u6536\u5e33\u6b3e ": { + "account_number": "1149", + "account_type": "Receivable" + }, + "\u61c9\u6536\u5206\u671f\u5e33\u6b3e ": { + "account_number": "1142", + "account_type": "Receivable" + }, + "\u61c9\u6536\u5e33\u6b3e ": { + "account_number": "1141", + "account_type": "Receivable" + } + }, + "\u61c9\u6536\u7968\u64da": { + "account_number": "113", + "account_type": "Receivable", + "\u5099\u62b5\u5446\u5e33 \uff0d\u61c9\u6536\u7968\u64da ": { + "account_number": "1139", + "account_type": "Receivable" + }, + "\u5176\u4ed6\u61c9\u6536\u7968\u64da ": { + "account_number": "1138", + "account_type": "Receivable" + }, + "\u61c9\u6536\u7968\u64da": { + "account_number": "1131", + "account_type": "Receivable" + }, + "\u61c9\u6536\u7968\u64da\u8cbc\u73fe ": { + "account_number": "1132", + "account_type": "Receivable" + } + }, + "\u73fe\u91d1\u53ca\u7d04\u7576\u73fe\u91d1": { + "account_number": "111", + "account_type": "Cash", + "\u5176\u4ed6\u73fe\u91d1\u53ca\u7d04\u7576\u73fe\u91d1": { + "account_number": "1118", + "account_type": "Cash" + }, + "\u5728\u9014\u73fe\u91d1": { + "account_number": "1116", + "account_type": "Cash" + }, + "\u5eab\u5b58\u73fe\u91d1": { + "account_number": "1111", + "account_type": "Cash" + }, + "\u7d04\u7576\u73fe\u91d1": { + "account_number": "1117", + "account_type": "Cash" + }, + "\u9280\u884c\u5b58\u6b3e": { + "account_number": "1113", + "account_type": "Bank", + "\u4e2d\u570b\u4fe1\u8a17": { + "account_type": "Bank" + }, + "\u53f0\u5317\u5bcc\u90a6": { + "account_type": "Bank" + } + }, + "\u96f6\u7528\u91d1/\u9031\u8f49\u91d1": { + "account_number": "1112", + "account_type": "Cash" + } + }, + "\u77ed\u671f\u6295\u8cc7": { + "account_number": "112", + "\u77ed\u671f\u6295\u8cc7 \u2014\u80a1\u7968": { + "account_number": "1121" + } + }, + "\u9810\u4ed8\u6b3e\u9805": { + "account_number": "126", + "\u5176\u4ed6\u9810\u4ed8\u6b3e\u9805": { + "account_number": "1268" + }, + "\u9810\u4ed8\u8ca8\u6b3e": { + "account_number": "1261" + } + }, + "\u9810\u4ed8\u8cbb\u7528": { + "account_number": "125", + "\u5176\u4ed6\u9810\u4ed8\u8cbb\u7528": { + "account_number": "1258" + }, + "\u7528\u54c1\u76e4\u5b58": { + "account_number": "1254" + }, + "\u9810\u4ed8\u4fdd\u96aa\u8cbb": { + "account_number": "1253" + }, + "\u9810\u4ed8\u6240\u5f97\u7a05": { + "account_number": "1255" + }, + "\u9810\u4ed8\u79df\u91d1": { + "account_number": "1252" + }, + "\u9810\u4ed8\u85aa\u8cc7": { + "account_number": "1251" + } } - }, - "32-\u8cc7\u672c\u516c\u7a4d": { - "321-\u80a1\u7968\u6ea2\u50f9": { - "3211-\u666e\u901a\u80a1\u80a1\u7968\u6ea2\u50f9": {}, - "3212-\u7279\u5225\u80a1\u80a1\u7968\u6ea2\u50f9": {} - }, - "323-\u8cc7\u7522\u91cd\u4f30\u589e\u503c\u6e96\u5099": { - "3231-\u8cc7\u7522\u91cd\u4f30\u589e\u503c\u6e96\u5099": {} - }, - "324-\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u516c\u7a4d": { - "3241-\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u516c\u7a4d": {} - }, - "325-\u5408\u4f75\u516c\u7a4d": { - "3251-\u5408\u4f75\u516c\u7a4d": {} - }, - "326-\u53d7\u8d08\u516c\u7a4d": { - "3261-\u53d7\u8d08\u516c\u7a4d": {} - }, - "328-\u5176\u4ed6\u8cc7\u672c\u516c\u7a4d": { - "3281-\u6b0a\u76ca\u6cd5\u9577\u671f\u80a1\u6b0a\u6295\u8cc7\u8cc7\u672c\u516c\u7a4d": {}, - "3282-\u8cc7\u672c\u516c\u7a4d\u2014 \u5eab\u85cf\u80a1\u7968\u4ea4\u6613": {} + }, + "\u7121\u5f62\u8cc7\u7522": { + "account_number": "17", + "\u5176\u4ed6\u7121\u5f62\u8cc7\u7522": { + "account_number": "178", + "\u905e\u5ef6\u9000\u4f11\u91d1\u6210\u672c": { + "account_number": "1781" + } + }, + "\u5546\u6a19\u6b0a": { + "account_number": "171", + "\u5546\u6a19\u6b0a": { + "account_number": "1711" + } + }, + "\u5546\u8b7d": { + "account_number": "176", + "\u5546\u8b7d": { + "account_number": "1761" + } + }, + "\u5c08\u5229\u6b0a": { + "account_number": "172", + "\u5c08\u5229\u6b0a": { + "account_number": "1721" + } + }, + "\u958b\u8fa6\u8cbb": { + "account_number": "177", + "\u958b\u8fa6\u8cbb": { + "account_number": "1771" + } } - }, - "33-\u4fdd\u7559\u76c8\u9918(\u7d2f\u7a4d\u8667\u640d)": { - "331-\u6cd5\u5b9a\u76c8\u9918\u516c\u7a4d": { - "3311-\u6cd5\u5b9a\u76c8\u9918\u516c\u7a4d": {} - }, - "332-\u7279\u5225\u76c8\u9918\u516c\u7a4d": { - "3321-\u610f\u5916\u640d\u5931\u6e96\u5099": {}, - "3322-\u6539\u826f\u64f4\u5145\u6e96\u5099": {}, - "3323-\u511f\u50b5\u6e96\u5099": {}, - "3328-\u5176\u4ed6\u7279\u5225\u76c8\u9918\u516c\u7a4d": {} - }, - "335-\u672a\u5206\u914d\u76c8\u9918(\u7d2f\u7a4d\u8667\u640d) ": { + }, + "\u905e\u8017\u8cc7\u7522": { + "account_number": "16", + "\u905e\u8017\u8cc7\u7522": { + "account_number": "161", "is_group": 1 } - }, - "34-\u6b0a\u76ca\u8abf\u6574": { - "341-\u9577\u671f\u80a1\u6b0a\u6295\u8cc7\u672a\u5be6\u73fe\u8dcc\u50f9\u640d\u5931": { - "3411-\u9577\u671f\u80a1\u6b0a\u6295\u8cc7\u672a\u5be6\u73fe\u8dcc\u50f9\u640d\u5931": {} - }, - "342-\u7d2f\u7a4d\u63db\u7b97\u8abf\u6574\u6578": { - "3421-\u7d2f\u7a4d\u63db\u7b97\u8abf\u6574\u6578": {} - }, - "343-\u672a\u8a8d\u5217\u70ba\u9000\u4f11\u91d1\u6210\u672c\u4e4b\u6de8\u640d\u5931": { - "3431-\u672a\u8a8d\u5217\u70ba\u9000\u4f11\u91d1\u6210\u672c\u4e4b\u6de8\u640d\u5931": {} + } + }, + "\u975e\u7d93\u5e38\u71df\u696d\u640d\u76ca": { + "account_number": "9", + "root_type": "Expense", + "\u505c\u696d\u90e8\u9580\u640d\u76ca": { + "account_number": "91", + "\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u505c\u696d\u524d\u71df\u696d\u640d\u76ca": { + "account_number": "911", + "\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u505c\u696d\u524d\u71df\u696d\u640d\u76ca": { + "account_number": "9111" + } + }, + "\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u8655\u5206\u640d\u76ca": { + "account_number": "912", + "\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u8655\u5206\u640d\u76ca": { + "account_number": "9121" + } } - }, - "35-\u5eab\u85cf\u80a1": { - "351-\u5eab\u85cf\u80a1": { - "3511-\u5eab\u85cf\u80a1": {} + }, + "\u5c11\u6578\u80a1\u6b0a\u6de8\u5229": { + "account_number": "94", + "\u5c11\u6578\u80a1\u6b0a\u6de8\u5229": { + "account_number": "941", + "\u5c11\u6578\u80a1\u6b0a\u6de8\u5229": { + "account_number": "9411" + } } - }, - "36-\u5c11\u6578\u80a1\u6b0a": { - "361-\u5c11\u6578\u80a1\u6b0a": { - "3611-\u5c11\u6578\u80a1\u6b0a": {} + }, + "\u6703\u8a08\u539f\u5247\u8b8a\u52d5\u7d2f\u7a4d\u5f71\u97ff\u6578": { + "account_number": "93", + "\u6703\u8a08\u539f\u5247\u8b8a\u52d5\u7d2f\u7a4d\u5f71\u97ff\u6578": { + "account_number": "931", + "\u6703\u8a08\u539f\u5247\u8b8a\u52d5\u7d2f\u7a4d\u5f71\u97ff\u6578": { + "account_number": "9311" + } } - }, - "root_type": "Equity" - }, - "4-\u71df\u696d\u6536\u5165": { - "41-\u92b7\u8ca8\u6536\u5165": { - "411-\u92b7\u8ca8\u6536\u5165": { - "4111-\u92b7\u8ca8\u6536\u5165": {}, - "4112-\u5206\u671f\u4ed8\u6b3e\u92b7\u8ca8\u6536\u5165": {} - }, - "417-\u92b7\u8ca8\u9000\u56de": { - "4171-\u92b7\u8ca8\u9000\u56de": {} - }, - "419-\u92b7\u8ca8\u6298\u8b93": { - "4191-\u92b7\u8ca8\u6298\u8b93": {} + }, + "\u975e\u5e38\u640d\u76ca": { + "account_number": "92", + "\u975e\u5e38\u640d\u76ca": { + "account_number": "921", + "\u975e\u5e38\u640d\u76ca": { + "account_number": "9211" + } } - }, - "46-\u52de\u52d9\u6536\u5165": { - "461-\u52de\u52d9\u6536\u5165": { - "4611-\u52de\u52d9\u6536\u5165": {} - } - }, - "47-\u696d\u52d9\u6536\u5165": { - "471-\u696d\u52d9\u6536\u5165": { - "4711-\u696d\u52d9\u6536\u5165": {} - } - }, - "48-\u5176\u4ed6\u71df\u696d\u6536\u5165": { - "488-\u5176\u4ed6\u71df\u696d\u6536\u5165\u2014\u5176\u4ed6": { - "4888-\u5176\u4ed6\u71df\u696d\u6536\u5165\u2014\u5176\u4ed6": {} - } - }, - "root_type": "Income" - }, - "5-\u71df\u696d\u6210\u672c": { - "51-\u92b7\u8ca8\u6210\u672c": { - "511-\u92b7\u8ca8\u6210\u672c": { - "5111-\u92b7\u8ca8\u6210\u672c": { - "account_type": "Cost of Goods Sold" - }, - "5112-\u5206\u671f\u4ed8\u6b3e\u92b7\u8ca8\u6210\u672c": { - "account_type": "Cost of Goods Sold" - }, - "account_type": "Cost of Goods Sold" - }, - "512-\u9032\u8ca8": { - "5121-\u9032\u8ca8": {}, - "5122-\u9032\u8ca8\u8cbb\u7528": {}, - "5123-\u9032\u8ca8\u9000\u51fa": {}, - "5124-\u9032\u8ca8\u6298\u8b93": {} - }, - "513-\u9032\u6599": { - "5131-\u9032\u6599": {}, - "5132-\u9032\u6599\u8cbb\u7528": {}, - "5133-\u9032\u6599\u9000\u51fa": {}, - "5134-\u9032\u6599\u6298\u8b93": {} - }, - "514-\u76f4\u63a5\u4eba\u5de5": { - "5141-\u76f4\u63a5\u4eba\u5de5": {} - }, - "515~518-\u88fd\u9020\u8cbb\u7528": { - "5151-\u9593\u63a5\u4eba\u5de5": {}, - "5152-\u79df\u91d1\u652f\u51fa": {}, - "5153-\u6587\u5177\u7528\u54c1": {}, - "5154-\u65c5\u8cbb": {}, - "5155-\u904b\u8cbb": {}, - "5156-\u90f5\u96fb\u8cbb": {}, - "5157-\u4fee\u7e55\u8cbb": {}, - "5158-\u5305\u88dd\u8cbb": {}, - "5161-\u6c34\u96fb\u74e6\u65af\u8cbb": {}, - "5162-\u4fdd\u96aa\u8cbb": {}, - "5163-\u52a0\u5de5\u8cbb": {}, - "5166-\u7a05\u6350": { - "account_type": "Tax", - "tax_rate": 5.0 - }, - "5168-\u6298\u820a ": { - "account_type": "Depreciation" - }, - "5169-\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": {}, - "5172-\u4f19\u98df\u8cbb": {}, - "5173-\u8077\u5de5\u798f\u5229": {}, - "5176-\u8a13\u7df4\u8cbb": {}, - "5177-\u9593\u63a5\u6750\u6599": {}, - "5188-\u5176\u4ed6\u88fd\u9020\u8cbb\u7528": {} - }, - "Expenses Included In Valuation": { - "account_type": "Expenses Included In Valuation" - }, - "account_type": "Cost of Goods Sold" - }, - "56-\u52de\u52d9\u6210\u672c\u88fd": { - "561-\u52de\u52d9\u6210\u672c": { - "5611-\u52de\u52d9\u6210\u672c": {} - } - }, - "57-\u696d\u52d9\u6210\u672c": { - "571-\u696d\u52d9\u6210\u672c": { - "5711-\u696d\u52d9\u6210\u672c": {} - } - }, - "58-\u5176\u4ed6\u71df\u696d\u6210\u672c": { - "588-\u5176\u4ed6\u71df\u696d\u6210\u672c\u2014\u5176\u4ed6 ": { - "5888-\u5176\u4ed6\u71df\u696d\u6210\u672c\u2014\u5176\u4ed6": {} - } - }, - "Stock Adjustment": { - "account_type": "Stock Adjustment" - }, - "root_type": "Expense" - }, - "6-\u71df\u696d\u8cbb\u7528": { - "61-\u63a8\u92b7\u8cbb\u7528": { - "615~618-\u63a8\u92b7\u8cbb\u7528": { - "6151-\u85aa\u8cc7\u652f\u51fa": {}, - "6152-\u79df\u91d1\u652f\u51fa": {}, - "6153-\u6587\u5177\u7528\u54c1": {}, - "6154-\u65c5\u8cbb": {}, - "6155-\u904b\u8cbb": {}, - "6156-\u90f5\u96fb\u8cbb": {}, - "6157-\u4fee\u7e55\u8cbb": {}, - "6159-\u5ee3\u544a\u8cbb": {}, - "6161-\u6c34\u96fb\u74e6\u65af\u8cbb": {}, - "6162-\u4fdd\u96aa\u8cbb": {}, - "6164-\u4ea4\u969b\u8cbb": {}, - "6165-\u6350\u8d08": {}, - "6166-\u7a05\u6350": { - "account_type": "Tax", - "tax_rate": 5.0 - }, - "6167-\u5446\u5e33\u640d\u5931": {}, - "6168-\u6298\u820a ": { - "account_type": "Depreciation" - }, - "6169-\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": {}, - "6172-\u4f19\u98df\u8cbb": {}, - "6173-\u8077\u5de5\u798f\u5229": {}, - "6175-\u4f63\u91d1\u652f\u51fa": {}, - "6176-\u8a13\u7df4\u8cbb": {}, - "6188-\u5176\u4ed6\u63a8\u92b7\u8cbb\u7528": {} - } - }, - "62-\u7ba1\u7406\u53ca\u7e3d\u52d9\u8cbb\u7528": { - "625~628-\u7ba1\u7406\u53ca\u7e3d\u52d9\u8cbb\u7528": { - "6251-\u85aa\u8cc7\u652f\u51fa": {}, - "6252-\u79df\u91d1\u652f\u51fa": {}, - "6253-\u6587\u5177\u7528\u54c1": {}, - "6254-\u65c5\u8cbb": {}, - "6255-\u904b\u8cbb": {}, - "6256-\u90f5\u96fb\u8cbb": {}, - "6257-\u4fee\u7e55\u8cbb": {}, - "6259-\u5ee3\u544a\u8cbb": {}, - "6261-\u6c34\u96fb\u74e6\u65af\u8cbb": {}, - "6262-\u4fdd\u96aa\u8cbb": {}, - "6264-\u4ea4\u969b\u8cbb": {}, - "6265-\u6350\u8d08": {}, - "6266-\u7a05\u6350": { - "account_type": "Tax", - "tax_rate": 5.0 - }, - "6267-\u5446\u5e33\u640d\u5931": {}, - "6268-\u6298\u820a": { - "account_type": "Depreciation" - }, - "6269-\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": {}, - "6271-\u5916\u92b7\u640d\u5931": {}, - "6272-\u4f19\u98df\u8cbb": {}, - "6273-\u8077\u5de5\u798f\u5229": {}, - "6274-\u7814\u7a76\u767c\u5c55\u8cbb\u7528": {}, - "6275-\u4f63\u91d1\u652f\u51fa": {}, - "6276-\u8a13\u7df4\u8cbb": {}, - "6278-\u52de\u52d9\u8cbb": {}, - "6288-\u5176\u4ed6\u7ba1\u7406\u53ca\u7e3d\u52d9\u8cbb\u7528": {} - } - }, - "63-\u7814\u7a76\u767c\u5c55\u8cbb\u7528": { - "635~638-\u7814\u7a76\u767c\u5c55\u8cbb\u7528": { - "6351-\u85aa\u8cc7\u652f\u51fa": {}, - "6352-\u79df\u91d1\u652f\u51fa": {}, - "6353-\u6587\u5177\u7528\u54c1": {}, - "6354-\u65c5\u8cbb": {}, - "6355-\u904b\u8cbb": {}, - "6356-\u90f5\u96fb\u8cbb": {}, - "6357-\u4fee\u7e55\u8cbb": {}, - "6361-\u6c34\u96fb\u74e6\u65af\u8cbb": {}, - "6362-\u4fdd\u96aa\u8cbb": {}, - "6364-\u4ea4\u969b\u8cbb": {}, - "6366-\u7a05\u6350": { - "account_type": "Tax", - "tax_rate": 5.0 - }, - "6368-\u6298\u820a": { - "account_type": "Depreciation" - }, - "6369-\u5404\u9805\u8017\u7aed\u53ca\u6524\u63d0": {}, - "6372-\u4f19\u98df\u8cbb": {}, - "6373-\u8077\u5de5\u798f\u5229": {}, - "6376-\u8a13\u7df4\u8cbb": {}, - "6378-\u5176\u4ed6\u7814\u7a76\u767c\u5c55\u8cbb\u7528": {} - } - }, - "root_type": "Expense" - }, - "7-\u71df\u696d\u5916\u6536\u5165\u53ca\u8cbb\u7528": { - "71~74-\u71df\u696d\u5916\u6536\u5165": { - "711-\u5229\u606f\u6536\u5165": { - "7111-\u5229\u606f\u6536\u5165": {} - }, - "712-\u6295\u8cc7\u6536\u76ca": { - "7121-\u6b0a\u76ca\u6cd5\u8a8d\u5217\u4e4b\u6295\u8cc7\u6536\u76ca": {}, - "7122-\u80a1\u5229\u6536\u5165": {}, - "7123-\u77ed\u671f\u6295\u8cc7\u5e02\u50f9\u56de\u5347\u5229\u76ca": {} - }, - "713-\u514c\u63db\u5229\u76ca": { - "7131-\u514c\u63db\u5229\u76ca": {} - }, - "714-\u8655\u5206\u6295\u8cc7\u6536\u76ca": { - "7141-\u8655\u5206\u6295\u8cc7\u6536\u76ca": {} - }, - "715-\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u6536\u5165": { - "7151-\u8655\u5206\u8cc7\u7522\u6ea2\u50f9\u6536\u5165": {} - }, - "748-\u5176\u4ed6\u71df\u696d\u5916\u6536\u5165": { - "7481-\u6350\u8d08\u6536\u5165": {}, - "7482-\u79df\u91d1\u6536\u5165": {}, - "7483-\u4f63\u91d1\u6536\u5165": {}, - "7484-\u51fa\u552e\u4e0b\u8173\u53ca\u5ee2\u6599\u6536\u5165": {}, - "7485-\u5b58\u8ca8\u76e4\u76c8": {}, - "7486-\u5b58\u8ca8\u8dcc\u50f9\u56de\u5347\u5229\u76ca": {}, - "7487-\u58de\u5e33\u8f49\u56de\u5229\u76ca": {}, - "7488-\u5176\u4ed6\u71df\u696d\u5916\u6536\u5165\u2014\u5176\u4ed6": {} - } - }, - "75~78-\u71df\u696d\u5916\u8cbb\u7528": { - "751-\u5229\u606f\u8cbb\u7528": { - "7511-\u5229\u606f\u8cbb\u7528": {} - }, - "752-\u6295\u8cc7\u640d\u5931": { - "7521-\u6b0a\u76ca\u6cd5\u8a8d\u5217\u4e4b\u6295\u8cc7\u640d\u5931": {}, - "7523-\u77ed\u671f\u6295\u8cc7\u672a\u5be6\u73fe\u8dcc\u50f9\u640d\u5931": {} - }, - "753-\u514c\u63db\u640d\u5931": { - "7531-\u514c\u63db\u640d\u5931": {} - }, - "754-\u8655\u5206\u6295\u8cc7\u640d\u5931": { - "7541-\u8655\u5206\u6295\u8cc7\u640d\u5931": {} - }, - "755-\u8655\u5206\u8cc7\u7522\u640d\u5931": { - "7551-\u8655\u5206\u8cc7\u7522\u640d\u5931 ": {} - }, - "788-\u5176\u4ed6\u71df\u696d\u5916\u8cbb\u7528": { - "7881-\u505c\u5de5\u640d\u5931": {}, - "7882-\u707d\u5bb3\u640d\u5931": {}, - "7885-\u5b58\u8ca8\u76e4\u640d": {}, - "7886-\u5b58\u8ca8\u8dcc\u50f9\u53ca\u5446\u6eef\u640d\u5931": {}, - "7888-\u5176\u4ed6\u71df\u696d\u5916\u8cbb\u7528\u2014\u5176\u4ed6": {} - } - }, - "root_type": "Income" - }, - "8-\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca)": { - "81-\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca)": { - "811-\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca) ": { - "8111-\u6240\u5f97\u7a05\u8cbb\u7528(\u5229\u76ca) ": {} - } - }, - "root_type": "Expense" - }, - "9-\u975e\u7d93\u5e38\u71df\u696d\u640d\u76ca": { - "91-\u505c\u696d\u90e8\u9580\u640d\u76ca": { - "911-\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u505c\u696d\u524d\u71df\u696d\u640d\u76ca": { - "9111-\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u505c\u696d\u524d\u71df\u696d\u640d\u76ca": {} - }, - "912-\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u8655\u5206\u640d\u76ca": { - "9121-\u505c\u696d\u90e8\u9580\u640d\u76ca\u2014\u8655\u5206\u640d\u76ca": {} - } - }, - "92-\u975e\u5e38\u640d\u76ca": { - "921-\u975e\u5e38\u640d\u76ca": { - "9211-\u975e\u5e38\u640d\u76ca": {} - } - }, - "93-\u6703\u8a08\u539f\u5247\u8b8a\u52d5\u7d2f\u7a4d\u5f71\u97ff\u6578": { - "931-\u6703\u8a08\u539f\u5247\u8b8a\u52d5\u7d2f\u7a4d\u5f71\u97ff\u6578": { - "9311-\u6703\u8a08\u539f\u5247\u8b8a\u52d5\u7d2f\u7a4d\u5f71\u97ff\u6578": {} - } - }, - "94-\u5c11\u6578\u80a1\u6b0a\u6de8\u5229": { - "941-\u5c11\u6578\u80a1\u6b0a\u6de8\u5229": { - "9411-\u5c11\u6578\u80a1\u6b0a\u6de8\u5229": {} - } - }, - "root_type": "Expense" + } } } } \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index c60944315e8..680f6e3ea97 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -2,9 +2,40 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals +import unittest import frappe from erpnext.stock import get_warehouse_account, get_company_default_inventory_account +class TestAccount(unittest.TestCase): + def test_rename_account(self): + if not frappe.db.exists("Account", "1210 - Debtors - _TC"): + acc = frappe.new_doc("Account") + acc.account_name = "Debtors" + acc.parent_account = "Accounts Receivable - _TC" + acc.account_number = "1210" + acc.company = "_Test Company" + acc.insert() + + account_number, account_name = frappe.db.get_value("Account", "1210 - Debtors - _TC", + ["account_number", "account_name"]) + self.assertEqual(account_number, "1210") + self.assertEqual(account_name, "Debtors") + + frappe.rename_doc("Account", "1210 - Debtors - _TC", "1211 - Debtors 1 - _TC") + + new_acc = frappe.db.get_value("Account", "1211 - Debtors 1 - _TC", + ["account_name", "account_number"], as_dict=1) + self.assertEqual(new_acc.account_name, "Debtors 1") + self.assertEqual(new_acc.account_number, "1211") + + frappe.rename_doc("Account", "1211 - Debtors 1 - _TC", "Debtors 2") + + new_acc = frappe.db.get_value("Account", "1211 - Debtors 2 - _TC", + ["account_name", "account_number"], as_dict=1) + self.assertEqual(new_acc.account_name, "Debtors 2") + self.assertEqual(new_acc.account_number, "1211") + + frappe.delete_doc("Account", "1211 - Debtors 2 - _TC") def _make_test_records(verbose): from frappe.test_runner import make_test_objects diff --git a/erpnext/accounts/doctype/account/test_account.js b/erpnext/accounts/doctype/account/tests/test_account.js similarity index 100% rename from erpnext/accounts/doctype/account/test_account.js rename to erpnext/accounts/doctype/account/tests/test_account.js diff --git a/erpnext/accounts/doctype/account/tests/test_account_with_number.js b/erpnext/accounts/doctype/account/tests/test_account_with_number.js new file mode 100644 index 00000000000..dd30eb7266a --- /dev/null +++ b/erpnext/accounts/doctype/account/tests/test_account_with_number.js @@ -0,0 +1,69 @@ +QUnit.module('accounts'); + +QUnit.test("test account with number", function(assert) { + assert.expect(7); + let done = assert.async(); + frappe.run_serially([ + () => frappe.set_route('Tree', 'Account'), + () => frappe.click_link('Income'), + () => frappe.click_button('Add Child'), + () => frappe.timeout(.5), + () => { + cur_dialog.fields_dict.account_name.$input.val("Test Income"); + cur_dialog.fields_dict.account_number.$input.val("4010"); + }, + () => frappe.click_button('Create New'), + () => frappe.timeout(1), + () => { + assert.ok($('a:contains("4010 - Test Income"):visible').length!=0, "Account created with number"); + }, + () => frappe.click_link('4010 - Test Income'), + () => frappe.click_button('Edit'), + () => frappe.timeout(.5), + () => frappe.click_button('Update Account Number'), + () => frappe.timeout(.5), + () => { + cur_dialog.fields_dict.account_number.$input.val("4020"); + }, + () => frappe.timeout(1), + () => cur_dialog.primary_action(), + () => frappe.timeout(1), + () => cur_frm.refresh_fields(), + () => frappe.timeout(.5), + () => { + var abbr = frappe.get_abbr(frappe.defaults.get_default("Company")); + var new_account = "4020 - Test Income - " + abbr; + assert.ok(cur_frm.doc.name==new_account, "Account renamed"); + assert.ok(cur_frm.doc.account_name=="Test Income", "account name remained same"); + assert.ok(cur_frm.doc.account_number=="4020", "Account number updated to 4020"); + }, + () => frappe.timeout(1), + () => frappe.click_button('Menu'), + () => frappe.click_link('Rename'), + () => frappe.timeout(.5), + () => { + cur_dialog.fields_dict.new_name.$input.val("4030 - Test Income"); + }, + () => frappe.timeout(.5), + () => frappe.click_button("Rename"), + () => frappe.timeout(1), + () => { + assert.ok(cur_frm.doc.account_name=="Test Income", "account name remained same"); + assert.ok(cur_frm.doc.account_number=="4030", "Account number updated to 4030"); + }, + () => frappe.timeout(.5), + () => frappe.click_button('Chart of Accounts'), + () => frappe.timeout(.5), + () => frappe.click_button('Menu'), + () => frappe.click_link('Refresh'), + () => frappe.click_button('Expand All'), + () => frappe.click_link('4030 - Test Income'), + () => frappe.click_button('Delete'), + () => frappe.click_button('Yes'), + () => frappe.timeout(.5), + () => { + assert.ok($('a:contains("4030 - Test Account"):visible').length==0, "Account deleted"); + }, + () => done() + ]); +}); diff --git a/erpnext/accounts/doctype/account/test_make_tax_account.js b/erpnext/accounts/doctype/account/tests/test_make_tax_account.js similarity index 100% rename from erpnext/accounts/doctype/account/test_make_tax_account.js rename to erpnext/accounts/doctype/account/tests/test_make_tax_account.js diff --git a/erpnext/docs/user/manual/en/accounts/chart-of-accounts.md b/erpnext/docs/user/manual/en/accounts/chart-of-accounts.md index f2208b47368..44a940ace8d 100644 --- a/erpnext/docs/user/manual/en/accounts/chart-of-accounts.md +++ b/erpnext/docs/user/manual/en/accounts/chart-of-accounts.md @@ -108,6 +108,11 @@ Supplier). Chart of Accounts +### Account Number +A standard chart of accounts is organized according to a numerical system. Each major category will begin with a certain number, and then the sub-categories within that major category will all begin with the same number. For example, if assets are classified by numbers starting with the digit 1000, then cash accounts might be labeled 1100, bank accounts might be labeled 1200, accounts receivable might be labeled 1300, and so on. A gap between account numbers is generally maintained for adding accounts in the future. + +You can assign a number while creating an account from Chart of Accounts page. You can also edit a number from account record, by clicking "Update Account Number" button. On updating account number, system renames the account name automatically to embed the number in the account name. + ### Other Account Types In ERPNext, you can also specify more information when you create a new @@ -115,6 +120,19 @@ Account, this is there to help you select that particular account in a scenario like Bank Account or a Tax Account and has no effect on the Chart itself. +Explanation of account types: +- **Bank:** The account group under which bank account will be created. +- **Cash:** The account group under which cash account will be created. +- **Cost of Goods Sold:** The account to book the accumulated total of all costs used to manufacture / purchase a product or service, sold by a company. +- **Depreciation:** The expense account to book the depreciation of teh fixed assets. +- **Expenses Included In Valuation:** The account to book the expenses (apart from direct material costs) included in landed cost of an item/product, used in Perpetual Inventory, . +- **Fixed Asset:** The account to maintain the costs of fixed assets. +- **Payable:** The account which represents the amount owed by a company to its creditors. +- **Receivable:** The account which represents the amount owed by a company by its debtors. +- **Stock:** The account group under which the warehouse account will be created. +- **Stock Adjustment:** An expense account to book any adjustment entry of stock/inventory, and generally comes at the same level of Cost of Goods Sold. +- **Stock Received But Not Billed:** A temporary liability account which holds the value of stock received but not billed yet and used in Perpetual Inventory. + ### Creating / Editing Accounts To create new Accounts, explore your Chart of Accounts and click on an Account @@ -124,7 +142,8 @@ will see an option to “Open” or “Add Child” a new Account. Chart of Accounts Option to create will only appear if you click on a Group (folder) type -Account. +Account. There you need to enter account name, account number and some more +optional details. ERPNext creates a standard structure for you when the Company is created but it is up to you to modify or add or remove accounts. diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 34ecf26316f..a0e11d63483 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -96,6 +96,7 @@ erpnext.company.set_chart_of_accounts_options = function(doc) { method: "erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts.get_charts_for_country", args: { "country": doc.country, + "with_standard": true }, callback: function(r) { if(!r.exc) { diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 4884c06343a..f4c9e06c727 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -249,10 +249,10 @@ class Company(Document): frappe.db.sql("""delete from `tabWarehouse` where company=%s""", self.name) frappe.defaults.clear_default("company", value=self.name) + frappe.db.sql("delete from `tabMode of Payment Account` where company=%s", self.name) # clear default accounts, warehouses from item if warehouses: - for f in ["default_warehouse", "website_warehouse"]: frappe.db.sql("""update tabItem set %s=NULL where %s in (%s)""" % (f, f, ', '.join(['%s']*len(warehouses))), tuple(warehouses)) diff --git a/erpnext/setup/doctype/company/test_records.json b/erpnext/setup/doctype/company/test_records.json index 7e26ca32074..084ee2b24b5 100644 --- a/erpnext/setup/doctype/company/test_records.json +++ b/erpnext/setup/doctype/company/test_records.json @@ -6,7 +6,7 @@ "default_currency": "INR", "doctype": "Company", "domain": "Manufacturing", - "chart_of_accounts": "Standard", + "chart_of_accounts": "India - Chart of Accounts", "default_holiday_list": "_Test Holiday List" }, { @@ -16,7 +16,7 @@ "default_currency": "USD", "doctype": "Company", "domain": "Retail", - "chart_of_accounts": "Standard", + "chart_of_accounts": "India - Chart of Accounts", "default_holiday_list": "_Test Holiday List" }, { @@ -26,7 +26,7 @@ "country": "Germany", "doctype": "Company", "domain": "Retail", - "chart_of_accounts": "Standard", + "chart_of_accounts": "India - Chart of Accounts", "default_holiday_list": "_Test Holiday List" } ] diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 003a57c852b..a8f6a7dde5f 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -40,8 +40,8 @@ def before_tests(): "company_tagline" :"Testing", "email" :"test@erpnext.com", "password" :"test", - "chart_of_accounts" : "Standard", - "domain" : "Manufacturing" + "chart_of_accounts" : "India - Chart of Accounts", + "domain" : "Manufacturing", }) frappe.db.sql("delete from `tabLeave Allocation`") diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 24e520c1e04..c3dbb8d4e73 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -28,6 +28,7 @@ class TestDeliveryNote(unittest.TestCase): if not frappe.db.exists("Account", target_warehouse): parent_account = frappe.db.get_value('Account', {'company': company, 'is_group':1, 'account_type': 'Stock'},'name') + account = create_account(account_name="_Test Warehouse 1", \ account_type="Stock", parent_account= parent_account, company=company) frappe.db.set_value('Warehouse', target_warehouse, 'account', account) From a5ebebd09cc9434dfe58e2938c441c4fc61986d9 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 16 Nov 2017 17:03:52 +0530 Subject: [PATCH 114/164] [enhance] Add Issue Type and Opportunity Type masters (#11598) * [enhance] added & linked Issue Type & Opportunity Type with opportunity * [patch] create issue and opportunity type from the custom field if available * [minor] issue_type and opportunity type should be mandatory * [patches] removed try catch from the patch * [fix] patch * [refactor] cleanup issue/opportunity type --- .../request_for_quotation.js | 7 +- .../crm/doctype/opportunity/opportunity.json | 12 +- .../crm/doctype/opportunity/opportunity.py | 7 +- .../doctype/opportunity/opportunity_list.js | 2 +- .../doctype/opportunity/test_opportunity.py | 4 +- .../crm/doctype/opportunity_type/__init__.py | 0 .../opportunity_type/opportunity_type.js | 8 ++ .../opportunity_type/opportunity_type.json | 135 ++++++++++++++++++ .../opportunity_type/opportunity_type.py | 10 ++ .../opportunity_type/test_opportunity_type.js | 23 +++ .../opportunity_type/test_opportunity_type.py | 10 ++ erpnext/demo/user/sales.py | 2 +- .../hub_message_to_lead/__init__.py | 2 +- erpnext/patches.txt | 1 + erpnext/patches/v9_1/__init__.py | 0 .../v9_1/create_issue_opportunity_type.py | 34 +++++ .../setup/setup_wizard/install_fixtures.py | 5 + erpnext/setup/setup_wizard/sample_data.py | 2 +- erpnext/support/doctype/issue/issue.json | 84 +++++++---- erpnext/support/doctype/issue/test_issue.js | 23 +++ .../support/doctype/issue_type/__init__.py | 0 .../support/doctype/issue_type/issue_type.js | 8 ++ .../doctype/issue_type/issue_type.json | 115 +++++++++++++++ .../support/doctype/issue_type/issue_type.py | 10 ++ .../doctype/issue_type/test_issue_type.js | 23 +++ .../doctype/issue_type/test_issue_type.py | 10 ++ erpnext/templates/utils.py | 66 ++++----- 27 files changed, 522 insertions(+), 81 deletions(-) create mode 100644 erpnext/crm/doctype/opportunity_type/__init__.py create mode 100644 erpnext/crm/doctype/opportunity_type/opportunity_type.js create mode 100644 erpnext/crm/doctype/opportunity_type/opportunity_type.json create mode 100644 erpnext/crm/doctype/opportunity_type/opportunity_type.py create mode 100644 erpnext/crm/doctype/opportunity_type/test_opportunity_type.js create mode 100644 erpnext/crm/doctype/opportunity_type/test_opportunity_type.py create mode 100644 erpnext/patches/v9_1/__init__.py create mode 100644 erpnext/patches/v9_1/create_issue_opportunity_type.py create mode 100644 erpnext/support/doctype/issue/test_issue.js create mode 100644 erpnext/support/doctype/issue_type/__init__.py create mode 100644 erpnext/support/doctype/issue_type/issue_type.js create mode 100644 erpnext/support/doctype/issue_type/issue_type.json create mode 100644 erpnext/support/doctype/issue_type/issue_type.py create mode 100644 erpnext/support/doctype/issue_type/test_issue_type.js create mode 100644 erpnext/support/doctype/issue_type/test_issue_type.py diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index 3801141fb92..c3d7a2c5cb8 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -254,7 +254,7 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e } }) }, __("Get items from")); - // Get items from Opportunity + // Get items from Opportunity this.frm.add_custom_button(__('Opportunity'), function() { erpnext.utils.map_current_doc({ @@ -264,11 +264,8 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e setters: { company: me.frm.doc.company }, - get_query_filters: { - enquiry_type: "Sales" - } }) - }, __("Get items from")); + }, __("Get items from")); // Get items from open Material Requests based on supplier this.frm.add_custom_button(__('Possible Supplier'), function() { // Create a dialog window for the user to pick their supplier diff --git a/erpnext/crm/doctype/opportunity/opportunity.json b/erpnext/crm/doctype/opportunity/opportunity.json index 89eb1919d05..ea07ce2587e 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.json +++ b/erpnext/crm/doctype/opportunity/opportunity.json @@ -270,8 +270,8 @@ "collapsible": 0, "columns": 0, "default": "Sales", - "fieldname": "enquiry_type", - "fieldtype": "Select", + "fieldname": "opportunity_type", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -284,14 +284,14 @@ "no_copy": 0, "oldfieldname": "enquiry_type", "oldfieldtype": "Select", - "options": "Sales\nMaintenance", + "options": "Opportunity Type", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -1189,7 +1189,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-21 02:07:46.486433", + "modified": "2017-11-15 17:44:46.241548", "modified_by": "Administrator", "module": "CRM", "name": "Opportunity", @@ -1239,7 +1239,7 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, - "search_fields": "status,transaction_date,customer,lead,enquiry_type,territory,company", + "search_fields": "status,transaction_date,customer,lead,opportunity_type,territory,company", "show_name_in_global_search": 1, "sort_field": "modified", "sort_order": "DESC", diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index e9a7baa4bc4..b8077fe1a58 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -246,7 +246,7 @@ def make_quotation(source_name, target_doc=None): "doctype": "Quotation", "field_map": { "enquiry_from": "quotation_to", - "enquiry_type": "order_type", + "opportunity_type": "order_type", "name": "enq_no", } }, @@ -267,10 +267,7 @@ def make_quotation(source_name, target_doc=None): def make_request_for_quotation(source_name, target_doc=None): doclist = get_mapped_doc("Opportunity", source_name, { "Opportunity": { - "doctype": "Request for Quotation", - "validation": { - "enquiry_type": ["=", "Sales"] - } + "doctype": "Request for Quotation" }, "Opportunity Item": { "doctype": "Request for Quotation Item", diff --git a/erpnext/crm/doctype/opportunity/opportunity_list.js b/erpnext/crm/doctype/opportunity/opportunity_list.js index 55a54633d02..0dbbf8add1c 100644 --- a/erpnext/crm/doctype/opportunity/opportunity_list.js +++ b/erpnext/crm/doctype/opportunity/opportunity_list.js @@ -1,5 +1,5 @@ frappe.listview_settings['Opportunity'] = { - add_fields: ["customer_name", "enquiry_type", "enquiry_from", "status"], + add_fields: ["customer_name", "opportunity_type", "enquiry_from", "status"], get_indicator: function(doc) { var indicator = [__(doc.status), frappe.utils.guess_colour(doc.status), "status,=," + doc.status]; if(doc.status=="Quotation") { diff --git a/erpnext/crm/doctype/opportunity/test_opportunity.py b/erpnext/crm/doctype/opportunity/test_opportunity.py index 61b583ce3b9..658e31f5680 100644 --- a/erpnext/crm/doctype/opportunity/test_opportunity.py +++ b/erpnext/crm/doctype/opportunity/test_opportunity.py @@ -30,7 +30,7 @@ class TestOpportunity(unittest.TestCase): args = { "doctype": "Opportunity", "contact_email":"new.opportunity@example.com", - "enquiry_type": "Sales", + "opportunity_type": "Sales", "with_items": 0, "transaction_date": today() } @@ -65,7 +65,7 @@ def make_opportunity(**args): opp_doc = frappe.get_doc({ "doctype": "Opportunity", "enquiry_from": args.enquiry_from or "Customer", - "enquiry_type": "Sales", + "opportunity_type": "Sales", "with_items": args.with_items or 0, "transaction_date": today() }) diff --git a/erpnext/crm/doctype/opportunity_type/__init__.py b/erpnext/crm/doctype/opportunity_type/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/crm/doctype/opportunity_type/opportunity_type.js b/erpnext/crm/doctype/opportunity_type/opportunity_type.js new file mode 100644 index 00000000000..174625e73c6 --- /dev/null +++ b/erpnext/crm/doctype/opportunity_type/opportunity_type.js @@ -0,0 +1,8 @@ +// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Opportunity Type', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/crm/doctype/opportunity_type/opportunity_type.json b/erpnext/crm/doctype/opportunity_type/opportunity_type.json new file mode 100644 index 00000000000..3ada0f11286 --- /dev/null +++ b/erpnext/crm/doctype/opportunity_type/opportunity_type.json @@ -0,0 +1,135 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "Prompt", + "beta": 0, + "creation": "2017-10-06 12:55:43.318773", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-11-15 17:27:12.271303", + "modified_by": "Administrator", + "module": "CRM", + "name": "Opportunity Type", + "name_case": "Title 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, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 0 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "search_fields": "", + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/crm/doctype/opportunity_type/opportunity_type.py b/erpnext/crm/doctype/opportunity_type/opportunity_type.py new file mode 100644 index 00000000000..48abac3fe29 --- /dev/null +++ b/erpnext/crm/doctype/opportunity_type/opportunity_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, 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 OpportunityType(Document): + pass diff --git a/erpnext/crm/doctype/opportunity_type/test_opportunity_type.js b/erpnext/crm/doctype/opportunity_type/test_opportunity_type.js new file mode 100644 index 00000000000..3a1ede94dba --- /dev/null +++ b/erpnext/crm/doctype/opportunity_type/test_opportunity_type.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Opportunity Type", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Opportunity Type + () => frappe.tests.make('Opportunity Type', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py b/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py new file mode 100644 index 00000000000..6410bbc3401 --- /dev/null +++ b/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestOpportunityType(unittest.TestCase): + pass diff --git a/erpnext/demo/user/sales.py b/erpnext/demo/user/sales.py index ddd36efc369..54ea173f878 100644 --- a/erpnext/demo/user/sales.py +++ b/erpnext/demo/user/sales.py @@ -54,7 +54,7 @@ def make_opportunity(): "doctype": "Opportunity", "enquiry_from": "Customer", "customer": get_random("Customer"), - "enquiry_type": "Sales", + "opportunity_type": "Sales", "with_items": 1, "transaction_date": frappe.flags.current_date, }) diff --git a/erpnext/hub_node/data_migration_mapping/hub_message_to_lead/__init__.py b/erpnext/hub_node/data_migration_mapping/hub_message_to_lead/__init__.py index 79769ee5f89..0ea1bc4b1a0 100644 --- a/erpnext/hub_node/data_migration_mapping/hub_message_to_lead/__init__.py +++ b/erpnext/hub_node/data_migration_mapping/hub_message_to_lead/__init__.py @@ -20,7 +20,7 @@ def post_process(remote_doc=None, local_doc=None, **kwargs): opportunity = frappe.get_doc({ 'doctype': 'Opportunity', 'naming_series': 'OPTY-', - 'enquiry_type': 'Sales', + 'opportunity_type': 'Hub', 'enquiry_from': 'Lead', 'status': 'Open', 'lead': lead.name, diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 6cb87b607ae..5d522b21fb2 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -462,3 +462,4 @@ erpnext.patches.v9_0.remove_non_existing_warehouse_from_stock_settings execute:frappe.delete_doc_if_exists("DocType", "Program Fee") erpnext.patches.v9_0.update_employee_loan_details erpnext.patches.v9_2.delete_healthcare_domain_default_items +erpnext.patches.v9_1.create_issue_opportunity_type diff --git a/erpnext/patches/v9_1/__init__.py b/erpnext/patches/v9_1/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/patches/v9_1/create_issue_opportunity_type.py b/erpnext/patches/v9_1/create_issue_opportunity_type.py new file mode 100644 index 00000000000..b5070b027f9 --- /dev/null +++ b/erpnext/patches/v9_1/create_issue_opportunity_type.py @@ -0,0 +1,34 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ + +def execute(): + # delete custom field if exists + for fieldname in ('issue_type', 'opportunity_type'): + custom_field = frappe.db.get_value("Custom Field", {"fieldname": fieldname}) + if custom_field: + frappe.delete_doc("Custom Field", custom_field, ignore_permissions=True) + + frappe.reload_doc('support', 'doctype', 'issue_type') + frappe.reload_doc('support', 'doctype', 'issue') + frappe.reload_doc('crm', 'doctype', 'opportunity_type') + frappe.reload_doc('crm', 'doctype', 'opportunity') + + # rename enquiry_type -> opportunity_type + from frappe.model.utils.rename_field import rename_field + rename_field('Opportunity', 'enquiry_type', 'opportunity_type') + + # create values if already set + for opts in (('Issue', 'issue_type', 'Issue Type'), + ('Opportunity', 'opportunity_type', 'Opportunity Type')): + for d in frappe.db.sql('select distinct {0} from `tab{1}`'.format(opts[1], opts[0])): + if not frappe.db.exists(opts[2], d[0]): + frappe.get_doc(dict(doctype = opts[2], name=d[0])).insert() + + # fixtures + for name in ('Hub', _('Sales'), _('Support'), _('Maintenance')): + if not frappe.db.exists('Opportunity', name): + frappe.get_doc(dict(doctype = 'Opportunity Type', name=name)).insert() diff --git a/erpnext/setup/setup_wizard/install_fixtures.py b/erpnext/setup/setup_wizard/install_fixtures.py index e6a4a81959e..bc0d2a352ef 100644 --- a/erpnext/setup/setup_wizard/install_fixtures.py +++ b/erpnext/setup/setup_wizard/install_fixtures.py @@ -212,6 +212,11 @@ def install(country=None): {'doctype': "Party Type", "party_type": "Supplier"}, {'doctype': "Party Type", "party_type": "Employee"}, + {'doctype': "Opportunity Type", "name": "Hub"}, + {'doctype': "Opportunity Type", "name": _("Sales")}, + {'doctype': "Opportunity Type", "name": _("Support")}, + {'doctype': "Opportunity Type", "name": _("Maintenance")}, + {'doctype': "Project Type", "project_type": "Internal"}, {'doctype': "Project Type", "project_type": "External"}, {'doctype': "Project Type", "project_type": "Other"}, diff --git a/erpnext/setup/setup_wizard/sample_data.py b/erpnext/setup/setup_wizard/sample_data.py index 43911f06c1d..e58b5f2e0c5 100644 --- a/erpnext/setup/setup_wizard/sample_data.py +++ b/erpnext/setup/setup_wizard/sample_data.py @@ -38,7 +38,7 @@ def make_opportunity(items, customer): "doctype": "Opportunity", "enquiry_from": "Customer", "customer": customer, - "enquiry_type": "Sales", + "opportunity_type": _("Sales"), "with_items": 1 }) diff --git a/erpnext/support/doctype/issue/issue.json b/erpnext/support/doctype/issue/issue.json index 529ae896302..137b0886e4d 100644 --- a/erpnext/support/doctype/issue/issue.json +++ b/erpnext/support/doctype/issue/issue.json @@ -105,11 +105,11 @@ { "allow_bulk_edit": 0, "allow_on_submit": 0, - "bold": 1, + "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "mins_to_first_response", - "fieldtype": "Float", + "fieldname": "issue_type", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -117,14 +117,15 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Mins to First Response", + "label": "Issue Type", "length": 0, "no_copy": 0, + "options": "Issue Type", "permlevel": 0, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -324,10 +325,10 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, "columns": 0, - "fieldname": "column_break_9", - "fieldtype": "Column Break", + "fieldname": "response", + "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -335,6 +336,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, + "label": "Response", "length": 0, "no_copy": 0, "permlevel": 0, @@ -352,12 +354,11 @@ { "allow_bulk_edit": 0, "allow_on_submit": 0, - "bold": 0, + "bold": 1, "collapsible": 0, "columns": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "resolution_date", - "fieldtype": "Datetime", + "fieldname": "mins_to_first_response", + "fieldtype": "Float", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -365,12 +366,11 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Resolution Date", + "label": "Mins to First Response", "length": 0, - "no_copy": 1, - "oldfieldname": "resolution_date", - "oldfieldtype": "Date", + "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, @@ -425,7 +425,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Contact", + "label": "Reference", "length": 0, "no_copy": 0, "options": "fa fa-pushpin", @@ -591,6 +591,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "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": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "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, @@ -629,7 +659,7 @@ "columns": 0, "depends_on": "eval:!doc.__islocal", "fieldname": "resolution_details", - "fieldtype": "Text Editor", + "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -752,8 +782,9 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "company", - "fieldtype": "Link", + "depends_on": "eval:!doc.__islocal", + "fieldname": "resolution_date", + "fieldtype": "Datetime", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -761,14 +792,15 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Company", + "label": "Resolution Date", "length": 0, - "no_copy": 0, - "options": "Company", + "no_copy": 1, + "oldfieldname": "resolution_date", + "oldfieldtype": "Date", "permlevel": 0, - "print_hide": 1, + "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -847,7 +879,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-13 14:29:19.581715", + "modified": "2017-11-15 17:15:40.347362", "modified_by": "Administrator", "module": "Support", "name": "Issue", diff --git a/erpnext/support/doctype/issue/test_issue.js b/erpnext/support/doctype/issue/test_issue.js new file mode 100644 index 00000000000..c532ea42d78 --- /dev/null +++ b/erpnext/support/doctype/issue/test_issue.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Issue", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Issue + () => frappe.tests.make('Issue', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/support/doctype/issue_type/__init__.py b/erpnext/support/doctype/issue_type/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/support/doctype/issue_type/issue_type.js b/erpnext/support/doctype/issue_type/issue_type.js new file mode 100644 index 00000000000..2b3d14ef712 --- /dev/null +++ b/erpnext/support/doctype/issue_type/issue_type.js @@ -0,0 +1,8 @@ +// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Issue Type', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/support/doctype/issue_type/issue_type.json b/erpnext/support/doctype/issue_type/issue_type.json new file mode 100644 index 00000000000..ee7add8c7cf --- /dev/null +++ b/erpnext/support/doctype/issue_type/issue_type.json @@ -0,0 +1,115 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "Prompt", + "beta": 0, + "creation": "2017-10-06 12:53:34.714153", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "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": "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-11-15 17:27:19.796807", + "modified_by": "Administrator", + "module": "Support", + "name": "Issue Type", + "name_case": "Title 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, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Support Team", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "search_fields": "", + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/support/doctype/issue_type/issue_type.py b/erpnext/support/doctype/issue_type/issue_type.py new file mode 100644 index 00000000000..f95d09cbf3e --- /dev/null +++ b/erpnext/support/doctype/issue_type/issue_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, 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 IssueType(Document): + pass diff --git a/erpnext/support/doctype/issue_type/test_issue_type.js b/erpnext/support/doctype/issue_type/test_issue_type.js new file mode 100644 index 00000000000..9ef737b6b10 --- /dev/null +++ b/erpnext/support/doctype/issue_type/test_issue_type.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Issue Type", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Issue Type + () => frappe.tests.make('Issue Type', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/support/doctype/issue_type/test_issue_type.py b/erpnext/support/doctype/issue_type/test_issue_type.py new file mode 100644 index 00000000000..4e3b66a8a4d --- /dev/null +++ b/erpnext/support/doctype/issue_type/test_issue_type.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestIssueType(unittest.TestCase): + pass diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py index 7ee39602f55..eb84bcc8d85 100644 --- a/erpnext/templates/utils.py +++ b/erpnext/templates/utils.py @@ -9,16 +9,16 @@ from frappe.utils import cint, formatdate @frappe.whitelist(allow_guest=True) def send_message(subject="Website Query", message="", sender="", status="Open"): - from frappe.www.contact import send_message as website_send_message - lead = customer = None + from frappe.www.contact import send_message as website_send_message + lead = customer = None - website_send_message(subject, message, sender) + website_send_message(subject, message, sender) - customer = frappe.db.sql("""select distinct dl.link_name from `tabDynamic Link` dl - left join `tabContact` c on dl.parent=c.name where dl.link_doctype='Customer' - and c.email_id='{email_id}'""".format(email_id=sender)) + customer = frappe.db.sql("""select distinct dl.link_name from `tabDynamic Link` dl + left join `tabContact` c on dl.parent=c.name where dl.link_doctype='Customer' + and c.email_id='{email_id}'""".format(email_id=sender)) - if not customer: + if not customer: lead = frappe.db.get_value('Lead', dict(email_id=sender)) if not lead: new_lead = frappe.get_doc(dict( @@ -27,33 +27,33 @@ def send_message(subject="Website Query", message="", sender="", status="Open"): lead_name = sender.split('@')[0].title() )).insert(ignore_permissions=True) - opportunity = frappe.get_doc(dict( - doctype ='Opportunity', - enquiry_from = 'Customer' if customer else 'Lead', - status = 'Open', - title = subject, - contact_email = sender, - to_discuss = message - )) + opportunity = frappe.get_doc(dict( + doctype ='Opportunity', + enquiry_from = 'Customer' if customer else 'Lead', + status = 'Open', + title = subject, + contact_email = sender, + to_discuss = message + )) - if customer: - opportunity.customer = customer[0][0] - elif lead: - opportunity.lead = lead - else: - opportunity.lead = new_lead.name + if customer: + opportunity.customer = customer[0][0] + elif lead: + opportunity.lead = lead + else: + opportunity.lead = new_lead.name - opportunity.insert(ignore_permissions=True) + opportunity.insert(ignore_permissions=True) - comm = frappe.get_doc({ - "doctype":"Communication", - "subject": subject, - "content": message, - "sender": sender, - "sent_or_received": "Received", - 'reference_doctype': 'Opportunity', - 'reference_name': opportunity.name - }) - comm.insert(ignore_permissions=True) + comm = frappe.get_doc({ + "doctype":"Communication", + "subject": subject, + "content": message, + "sender": sender, + "sent_or_received": "Received", + 'reference_doctype': 'Opportunity', + 'reference_name': opportunity.name + }) + comm.insert(ignore_permissions=True) - return "okay" + return "okay" From 1749b7c16b3b2280a647ce6c15e05a0162e3bab8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 16 Nov 2017 17:48:59 +0530 Subject: [PATCH 115/164] Minor fixes related to account renaming and deletion --- erpnext/accounts/doctype/account/account.py | 24 ++++--------------- .../setup/doctype/company/test_records.json | 6 ++--- erpnext/setup/utils.py | 2 +- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index ce4fb3f764a..36f8ce2c3b2 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -5,12 +5,12 @@ from __future__ import unicode_literals import frappe from frappe.utils import cint, cstr from frappe import throw, _ -from frappe.model.document import Document +from frappe.utils.nestedset import NestedSet class RootNotEditable(frappe.ValidationError): pass class BalanceMismatchError(frappe.ValidationError): pass -class Account(Document): +class Account(NestedSet): nsm_parent_field = 'parent_account' def onload(self): @@ -160,26 +160,12 @@ class Account(Document): if not self.report_type: throw(_("Report Type is mandatory")) - - def update_nsm_model(self): - """update lft, rgt indices for nested set model""" - import frappe - import frappe.utils.nestedset - frappe.utils.nestedset.update_nsm(self) - - def on_update(self): - self.update_nsm_model() - - def validate_trash(self): - """checks gl entries and if child exists""" + def on_trash(self): + # checks gl entries and if child exists if self.check_gle_exists(): throw(_("Account with existing transaction can not be deleted")) - if self.check_if_child_exists(): - throw(_("Child account exists for this account. You can not delete this account.")) - def on_trash(self): - self.validate_trash() - self.update_nsm_model() + super(Account, self).on_trash() def before_rename(self, old, new, merge=False): # Add company abbr if not provided diff --git a/erpnext/setup/doctype/company/test_records.json b/erpnext/setup/doctype/company/test_records.json index 084ee2b24b5..7e26ca32074 100644 --- a/erpnext/setup/doctype/company/test_records.json +++ b/erpnext/setup/doctype/company/test_records.json @@ -6,7 +6,7 @@ "default_currency": "INR", "doctype": "Company", "domain": "Manufacturing", - "chart_of_accounts": "India - Chart of Accounts", + "chart_of_accounts": "Standard", "default_holiday_list": "_Test Holiday List" }, { @@ -16,7 +16,7 @@ "default_currency": "USD", "doctype": "Company", "domain": "Retail", - "chart_of_accounts": "India - Chart of Accounts", + "chart_of_accounts": "Standard", "default_holiday_list": "_Test Holiday List" }, { @@ -26,7 +26,7 @@ "country": "Germany", "doctype": "Company", "domain": "Retail", - "chart_of_accounts": "India - Chart of Accounts", + "chart_of_accounts": "Standard", "default_holiday_list": "_Test Holiday List" } ] diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index a8f6a7dde5f..d77ebd16995 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -40,7 +40,7 @@ def before_tests(): "company_tagline" :"Testing", "email" :"test@erpnext.com", "password" :"test", - "chart_of_accounts" : "India - Chart of Accounts", + "chart_of_accounts" : "Standard", "domain" : "Manufacturing", }) From 8f43d2514ca96cdf244031951ae595eacf20ec8d Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 16 Nov 2017 18:06:26 +0530 Subject: [PATCH 116/164] Multiple variant creation dialog (#11608) * Multiple variant creation dialog * variant dialog codacy fixes * [multiple variants] show_alert, and other minors --- erpnext/controllers/item_variant.py | 70 +++++++++++- erpnext/stock/doctype/item/item.js | 165 ++++++++++++++++++++++++++-- 2 files changed, 222 insertions(+), 13 deletions(-) diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py index 821c81cad31..9817f0f47ae 100644 --- a/erpnext/controllers/item_variant.py +++ b/erpnext/controllers/item_variant.py @@ -169,6 +169,74 @@ def create_variant(item, args): return variant +@frappe.whitelist() +def enqueue_multiple_variant_creation(item, args): + # There can be innumerable attribute combinations, enqueue + frappe.enqueue("erpnext.controllers.item_variant.create_multiple_variants", + item=item, args=args, now=frappe.flags.in_test); + +def create_multiple_variants(item, args): + if isinstance(args, basestring): + args = json.loads(args) + + args_set = generate_keyed_value_combinations(args) + + for attribute_values in args_set: + if not get_variant(item, args=attribute_values): + variant = create_variant(item, attribute_values) + variant.save() + +def generate_keyed_value_combinations(args): + """ + From this: + + args = {"attr1": ["a", "b", "c"], "attr2": ["1", "2"], "attr3": ["A"]} + + To this: + + [ + {u'attr1': u'a', u'attr2': u'1', u'attr3': u'A'}, + {u'attr1': u'b', u'attr2': u'1', u'attr3': u'A'}, + {u'attr1': u'c', u'attr2': u'1', u'attr3': u'A'}, + {u'attr1': u'a', u'attr2': u'2', u'attr3': u'A'}, + {u'attr1': u'b', u'attr2': u'2', u'attr3': u'A'}, + {u'attr1': u'c', u'attr2': u'2', u'attr3': u'A'} + ] + + """ + # Return empty list if empty + if not args: + return [] + + # Turn `args` into a list of lists of key-value tuples: + # [ + # [(u'attr2', u'1'), (u'attr2', u'2')], + # [(u'attr3', u'A')], + # [(u'attr1', u'a'), (u'attr1', u'b'), (u'attr1', u'c')] + # ] + key_value_lists = [[(key, val) for val in args[key]] for key in args.keys()] + + # Store the first, but as objects + # [{u'attr2': u'1'}, {u'attr2': u'2'}] + results = key_value_lists.pop(0) + results = [{d[0]: d[1]} for d in results] + + # Iterate the remaining + # Take the next list to fuse with existing results + for l in key_value_lists: + new_results = [] + for res in results: + for key_val in l: + # create a new clone of object in result + obj = copy.deepcopy(res) + # to be used with every incoming new value + obj[key_val[0]] = key_val[1] + # and pushed into new_results + new_results.append(obj) + results = new_results + + return results + def copy_attributes_to_variant(item, variant): from frappe.model import no_value_fields @@ -208,7 +276,7 @@ def copy_attributes_to_variant(item, variant): attributes_description = "" for d in variant.attributes: attributes_description += "
" + d.attribute + ": " + cstr(d.attribute_value) + "
" - + if attributes_description not in variant.description: variant.description += attributes_description diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 656ee690209..a71e1eadbb9 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -57,9 +57,19 @@ frappe.ui.form.on("Item", { frappe.set_route("List", "Item", {"variant_of": frm.doc.name}); }, __("View")); - frm.add_custom_button(__("Variant"), function() { - erpnext.item.make_variant(frm); - }, __("Make")); + if(frm.doc.variant_based_on==="Item Attribute") { + frm.add_custom_button(__("Single Variant"), function() { + erpnext.item.show_single_variant_dialog(frm); + }, __("Make")); + frm.add_custom_button(__("Multiple Variants"), function() { + erpnext.item.show_multiple_variants_dialog(frm); + }, __("Make")); + } else { + frm.add_custom_button(__("Variant"), function() { + erpnext.item.show_modal_for_manufacturers(frm); + }, __("Make")); + } + frm.page.set_inner_btn_group_as_primary(__("Make")); } if (frm.doc.variant_of) { @@ -263,14 +273,6 @@ $.extend(erpnext.item, { } }, - make_variant: function(frm) { - if(frm.doc.variant_based_on==="Item Attribute") { - erpnext.item.show_modal_for_item_attribute_selection(frm); - } else { - erpnext.item.show_modal_for_manufacturers(frm); - } - }, - show_modal_for_manufacturers: function(frm) { var dialog = new frappe.ui.Dialog({ fields: [ @@ -301,7 +303,146 @@ $.extend(erpnext.item, { dialog.show(); }, - show_modal_for_item_attribute_selection: function(frm) { + 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 = {}; + + function make_fields_from_attribute_values(attr_dict) { + let fields = []; + Object.keys(attr_dict).forEach((name, i) => { + if(i % 3 === 0){ + fields.push({fieldtype: 'Section Break'}); + } + fields.push({fieldtype: 'Column Break', label: name}); + attr_dict[name].forEach(value => { + fields.push({ + fieldtype: 'Check', + label: value, + fieldname: value, + default: 0, + onchange: function() { + let selected_attributes = get_selected_attributes(); + let lengths = []; + Object.keys(selected_attributes).map(key => { + lengths.push(selected_attributes[key].length); + }); + if(lengths.includes(0)) { + me.multiple_variant_dialog.get_primary_btn().html(__("Make Variants")); + me.multiple_variant_dialog.disable_primary_action(); + } else { + let no_of_combinations = lengths.reduce((a, b) => a * b, 1); + me.multiple_variant_dialog.get_primary_btn() + .html(__( + `Make ${no_of_combinations} Variant + ${no_of_combinations === 1 ? '' : 's'}` + )); + me.multiple_variant_dialog.enable_primary_action(); + } + } + }); + }); + }); + return fields; + } + + function make_and_show_dialog(fields) { + me.multiple_variant_dialog = new frappe.ui.Dialog({ + title: __("Select Attribute Values"), + fields: [ + { + fieldtype: "HTML", + fieldname: "help", + options: ``, + } + ].concat(fields) + }); + + me.multiple_variant_dialog.set_primary_action(__("Make Variants"), () => { + let selected_attributes = get_selected_attributes(); + + me.multiple_variant_dialog.hide(); + frappe.call({ + method:"erpnext.controllers.item_variant.enqueue_multiple_variant_creation", + args: { + "item": frm.doc.name, + "args": selected_attributes + }, + callback: function() { + frappe.show_alert({ + message: __("Variant creation has been queued."), + indicator: 'orange' + }); + } + }); + }); + + $($(me.multiple_variant_dialog.$wrapper.find('.form-column')) + .find('.frappe-control')).css('margin-bottom', '0px'); + + me.multiple_variant_dialog.disable_primary_action(); + me.multiple_variant_dialog.clear(); + me.multiple_variant_dialog.show(); + } + + function get_selected_attributes() { + let selected_attributes = {}; + me.multiple_variant_dialog.$wrapper.find('.form-column').each((i, col) => { + if(i===0) return; + let attribute_name = $(col).find('label').html(); + selected_attributes[attribute_name] = []; + let checked_opts = $(col).find('.checkbox input'); + checked_opts.each((i, opt) => { + if($(opt).is(':checked')) { + selected_attributes[attribute_name].push($(opt).attr('data-fieldname')); + } + }); + }); + + return selected_attributes; + } + + let attribute_names = frm.doc.attributes.map(d => d.attribute); + + attribute_names.forEach(function(attribute) { + let p = new Promise(resolve => { + frappe.call({ + method:"frappe.client.get_list", + args:{ + doctype:"Item Attribute Value", + filters: [ + ["parent","=", attribute] + ], + fields: ["attribute_value"] + } + }).then((r) => { + if(r.message) { + attr_val_fields[attribute] = r.message.map(function(d) { return d.attribute_value; }); + resolve(); + } + }); + }); + + promises.push(p); + + }, this); + + Promise.all(promises).then(() => { + let fields = make_fields_from_attribute_values(attr_val_fields); + make_and_show_dialog(fields); + }) + + }, + + show_single_variant_dialog: function(frm) { var fields = [] for(var i=0;i< frm.doc.attributes.length;i++){ From bb34c57603394d76393046ef43e4c2c9a492d941 Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 16 Nov 2017 18:10:04 +0530 Subject: [PATCH 117/164] link the address and contact with the sales partner (#11592) --- erpnext/setup/doctype/sales_partner/sales_partner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.js b/erpnext/setup/doctype/sales_partner/sales_partner.js index b1c18d67c75..30c2c91d6f2 100644 --- a/erpnext/setup/doctype/sales_partner/sales_partner.js +++ b/erpnext/setup/doctype/sales_partner/sales_partner.js @@ -3,7 +3,7 @@ frappe.ui.form.on('Sales Partner', { refresh: function(frm) { - frappe.dynamic_link = {doc: frm.doc, fieldname: 'name', doctype: 'Sales Person'} + frappe.dynamic_link = {doc: frm.doc, fieldname: 'name', doctype: 'Sales Partner'} if(frm.doc.__islocal){ hide_field(['address_html', 'contact_html', 'address_contacts']); From 51a397c97fb6f8d8a2939fc9bd605e2c55864b76 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 16 Nov 2017 18:23:16 +0530 Subject: [PATCH 118/164] [fix] Valuation rate in stock entry and code cleanup (#11614) --- .../stock/doctype/stock_entry/stock_entry.js | 228 ++++++++++-------- .../stock/doctype/stock_entry/stock_entry.py | 2 +- 2 files changed, 133 insertions(+), 97 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 5315253f7ee..853b20dd224 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -14,8 +14,6 @@ frappe.ui.form.on('Stock Entry', { ] } }); - // }, - // onload_post_render: function(frm) { frm.set_query('batch_no', 'items', function(doc, cdt, cdn) { var item = locals[cdt][cdn]; @@ -40,9 +38,8 @@ frappe.ui.form.on('Stock Entry', { } } }); - - }, + refresh: function(frm) { if(!frm.doc.docstatus) { frm.add_custom_button(__('Make Material Request'), function() { @@ -73,10 +70,12 @@ frappe.ui.form.on('Stock Entry', { frm.trigger("toggle_display_account_head"); } }, + purpose: function(frm) { frm.fields_dict.items.grid.refresh(); frm.cscript.toggle_related_fields(frm.doc); }, + company: function(frm) { if(frm.doc.company) { var company_doc = frappe.get_doc(":Company", frm.doc.company); @@ -86,6 +85,7 @@ frappe.ui.form.on('Stock Entry', { frm.trigger("toggle_display_account_head"); } }, + set_serial_no: function(frm, cdt, cdn) { var d = frappe.model.get_doc(cdt, cdn); if(!d.item_code && !d.s_warehouse && !d.qty) return; @@ -104,20 +104,142 @@ frappe.ui.form.on('Stock Entry', { } }); }, + toggle_display_account_head: function(frm) { var enabled = erpnext.is_perpetual_inventory_enabled(frm.doc.company); frm.fields_dict["items"].grid.set_column_disp(["cost_center", "expense_account"], enabled); - } + }, + + set_basic_rate: function(frm, cdt, cdn, callback) { + const item = locals[cdt][cdn]; + item.transfer_qty = flt(item.qty) * flt(item.conversion_factor); + + const args = { + 'item_code' : item.item_code, + 'posting_date' : frm.doc.posting_date, + 'posting_time' : frm.doc.posting_time, + 'warehouse' : cstr(item.s_warehouse) || cstr(item.t_warehouse), + 'serial_no ' : item.serial_no, + 'company' : frm.doc.company, + 'qty' : item.s_warehouse ? -1*flt(item.transfer_qty) : flt(item.transfer_qty) + }; + + frappe.call({ + method: "erpnext.stock.utils.get_incoming_rate", + args: { + args: args + }, + callback: function(r) { + frappe.model.set_value(cdt, cdn, 'basic_rate', r.message); + frm.events.calculate_basic_amount(frm, item); + + if (callback) { + callback(); + } + } + }) + }, + + get_warehouse_details: function(frm, cdt, cdn, callback) { + var child = locals[cdt][cdn]; + if(!child.bom_no) { + frappe.call({ + method: "erpnext.stock.doctype.stock_entry.stock_entry.get_warehouse_details", + args: { + "args": { + 'item_code': child.item_code, + 'warehouse': cstr(child.s_warehouse) || cstr(child.t_warehouse), + 'transfer_qty': child.transfer_qty, + 'serial_no': child.serial_no, + 'qty': child.s_warehouse ? -1* child.transfer_qty : child.transfer_qty, + 'posting_date': frm.doc.posting_date, + 'posting_time': frm.doc.posting_time + } + }, + callback: function(r) { + if (!r.exc) { + $.extend(child, r.message); + frm.events.calculate_basic_amount(frm, child); + } + + if (callback) { + callback(); + } + } + }); + } + }, + + calculate_basic_amount: function(frm, item) { + item.basic_amount = flt(flt(item.transfer_qty) * flt(item.basic_rate), + precision("basic_amount", item)); + + frm.events.calculate_amount(frm); + }, + + calculate_amount: function(frm) { + frm.events.calculate_total_additional_costs(frm); + + const total_basic_amount = frappe.utils.sum( + (frm.doc.items || []).map(function(i) { return i.t_warehouse ? flt(i.basic_amount) : 0; }) + ); + + for (let i in frm.doc.items) { + let item = frm.doc.items[i]; + + if (item.t_warehouse && total_basic_amount) { + item.additional_cost = (flt(item.basic_amount) / total_basic_amount) * frm.doc.total_additional_costs; + } else { + item.additional_cost = 0; + } + + item.amount = flt(item.basic_amount + flt(item.additional_cost), + precision("amount", item)); + + item.valuation_rate = flt(flt(item.basic_rate) + + (flt(item.additional_cost) / flt(item.transfer_qty)), + precision("valuation_rate", item)); + } + + refresh_field('items'); + }, + + calculate_total_additional_costs: function(frm) { + const total_additional_costs = frappe.utils.sum( + (frm.doc.additional_costs || []).map(function(c) { return flt(c.amount); }) + ); + + frm.set_value("total_additional_costs", + flt(total_additional_costs, precision("total_additional_costs"))); + }, }) frappe.ui.form.on('Stock Entry Detail', { qty: function(frm, cdt, cdn) { - frm.events.set_serial_no(frm, cdt, cdn); + frm.events.set_basic_rate(frm, cdt, cdn, () => { + frm.events.set_serial_no(frm, cdt, cdn); + }); + }, + + conversion_factor: function(frm, cdt, cdn) { + frm.events.set_basic_rate(frm, cdt, cdn); }, s_warehouse: function(frm, cdt, cdn) { - frm.events.set_serial_no(frm, cdt, cdn); + frm.events.get_warehouse_details(frm, cdt, cdn, () => { + frm.events.set_serial_no(frm, cdt, cdn); + }); }, + + t_warehouse: function(frm, cdt, cdn) { + frm.events.get_warehouse_details(frm, cdt, cdn); + }, + + basic_rate: function(frm, cdt, cdn) { + var item = locals[cdt][cdn]; + frm.events.calculate_basic_amount(frm, item); + }, + barcode: function(doc, cdt, cdn) { var d = locals[cdt][cdn]; if (d.barcode) { @@ -132,6 +254,7 @@ frappe.ui.form.on('Stock Entry Detail', { }); } }, + uom: function(doc, cdt, cdn) { var d = locals[cdt][cdn]; if(d.uom && d.item_code){ @@ -150,6 +273,7 @@ frappe.ui.form.on('Stock Entry Detail', { }); } }, + item_code: function(frm, cdt, cdn) { var d = locals[cdt][cdn]; if(d.item_code) { @@ -191,7 +315,7 @@ frappe.ui.form.on('Stock Entry Detail', { frappe.ui.form.on('Landed Cost Taxes and Charges', { amount: function(frm) { - frm.events.calculate_amount(); + frm.events.calculate_amount(frm); } }); @@ -330,12 +454,6 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ } }, - qty: function(doc, cdt, cdn) { - var d = locals[cdt][cdn]; - d.transfer_qty = flt(d.qty) * flt(d.conversion_factor); - this.calculate_basic_amount(d); - }, - production_order: function() { var me = this; this.toggle_enable_bom(); @@ -434,88 +552,6 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ erpnext.setup_serial_no(); }, - basic_rate: function(doc, cdt, cdn) { - var item = frappe.model.get_doc(cdt, cdn); - this.calculate_basic_amount(item); - }, - - s_warehouse: function(doc, cdt, cdn) { - this.get_warehouse_details(doc, cdt, cdn) - }, - - t_warehouse: function(doc, cdt, cdn) { - this.get_warehouse_details(doc, cdt, cdn) - }, - - get_warehouse_details: function(doc, cdt, cdn) { - var me = this; - var d = locals[cdt][cdn]; - if(!d.bom_no) { - frappe.call({ - method: "erpnext.stock.doctype.stock_entry.stock_entry.get_warehouse_details", - args: { - "args": { - 'item_code': d.item_code, - 'warehouse': cstr(d.s_warehouse) || cstr(d.t_warehouse), - 'transfer_qty': d.transfer_qty, - 'serial_no': d.serial_no, - 'qty': d.s_warehouse ? -1* d.qty : d.qty, - 'posting_date': this.frm.doc.posting_date, - 'posting_time': this.frm.doc.posting_time - } - }, - callback: function(r) { - if (!r.exc) { - $.extend(d, r.message); - me.calculate_basic_amount(d); - } - } - }); - } - }, - - calculate_basic_amount: function(item) { - item.basic_amount = flt(flt(item.transfer_qty) * flt(item.basic_rate), - precision("basic_amount", item)); - - this.calculate_amount(); - }, - - calculate_amount: function() { - this.calculate_total_additional_costs(); - - var total_basic_amount = frappe.utils.sum( - (this.frm.doc.items || []).map(function(i) { return i.t_warehouse ? flt(i.basic_amount) : 0; }) - ); - - for (var i in this.frm.doc.items) { - var item = this.frm.doc.items[i]; - - if (item.t_warehouse && total_basic_amount) { - item.additional_cost = (flt(item.basic_amount) / total_basic_amount) * this.frm.doc.total_additional_costs; - } else { - item.additional_cost = 0; - } - - item.amount = flt(item.basic_amount + flt(item.additional_cost), - precision("amount", item)); - - item.valuation_rate = flt(flt(item.basic_rate) - + (flt(item.additional_cost) / flt(item.transfer_qty)), - precision("valuation_rate", item)); - } - - refresh_field('items'); - }, - - calculate_total_additional_costs: function() { - var total_additional_costs = frappe.utils.sum( - (this.frm.doc.additional_costs || []).map(function(c) { return flt(c.amount); }) - ); - - this.frm.set_value("total_additional_costs", flt(total_additional_costs, precision("total_additional_costs"))); - }, - toggle_related_fields: function(doc) { this.frm.toggle_enable("from_warehouse", doc.purpose!='Material Receipt'); this.frm.toggle_enable("to_warehouse", doc.purpose!='Material Issue'); diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index fc45f13602a..4d79e13d747 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -517,7 +517,7 @@ class StockEntry(StockController): args['posting_date'] = self.posting_date args['posting_time'] = self.posting_time - stock_and_rate = args.get('warehouse') and get_warehouse_details(args) or {} + stock_and_rate = get_warehouse_details(args) if args.get('warehouse') else {} ret.update(stock_and_rate) # automatically select batch for outgoing item From d9978d9c4f2e9301e031b6e57901b12979e8aaef Mon Sep 17 00:00:00 2001 From: Britlog Date: Thu, 16 Nov 2017 14:08:13 +0100 Subject: [PATCH 119/164] Check stock in shopping cart (#11529) --- erpnext/shopping_cart/cart.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py index 5c7d825b801..7bc7874b2f7 100644 --- a/erpnext/shopping_cart/cart.py +++ b/erpnext/shopping_cart/cart.py @@ -10,6 +10,7 @@ from frappe.contacts.doctype.address.address import get_address_display from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import get_shopping_cart_settings from frappe.utils.nestedset import get_root_of from erpnext.accounts.utils import get_account_name +from erpnext.utilities.product import get_qty_in_stock class WebsitePriceListMissingError(frappe.ValidationError): pass @@ -61,6 +62,9 @@ def place_order(): sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True)) for item in sales_order.get("items"): item.reserved_warehouse = frappe.db.get_value("Item", item.item_code, "website_warehouse") or None + item_stock = get_qty_in_stock(item.item_code, "website_warehouse") + if item.qty > item_stock.stock_qty[0][0]: + throw(_("Only {0} in stock for item {1}").format(item_stock.stock_qty[0][0], item.item_code)) sales_order.flags.ignore_permissions = True sales_order.insert() From 82b200e497c1964c9660bcfe67fdedb627059029 Mon Sep 17 00:00:00 2001 From: Vishal Dhayagude Date: Fri, 17 Nov 2017 11:01:42 +0530 Subject: [PATCH 120/164] [fix] Patch fail (#11623) --- erpnext/patches/v9_1/create_issue_opportunity_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/patches/v9_1/create_issue_opportunity_type.py b/erpnext/patches/v9_1/create_issue_opportunity_type.py index b5070b027f9..af7ee5d6c3b 100644 --- a/erpnext/patches/v9_1/create_issue_opportunity_type.py +++ b/erpnext/patches/v9_1/create_issue_opportunity_type.py @@ -30,5 +30,5 @@ def execute(): # fixtures for name in ('Hub', _('Sales'), _('Support'), _('Maintenance')): - if not frappe.db.exists('Opportunity', name): + if not frappe.db.exists('Opportunity Type', name): frappe.get_doc(dict(doctype = 'Opportunity Type', name=name)).insert() From 2a89a502f07ef0b5895f1991c3e9cadbd29240db Mon Sep 17 00:00:00 2001 From: Britlog Date: Fri, 17 Nov 2017 07:11:07 +0100 Subject: [PATCH 121/164] [Website] Items list and stock (#11480) * Add stock availability in items list and a parameter to set the number of products per page * Substract reserved_qty from actual_qty for website stock --- .../products_settings/products_settings.json | 53 ++++++++++++++++++- .../test_products_settings.js | 23 ++++++++ .../test_products_settings.py | 10 ++++ .../setup/doctype/item_group/item_group.py | 30 ++++++----- .../templates/includes/products_as_grid.html | 9 +++- erpnext/templates/pages/product_search.py | 24 +++++---- erpnext/utilities/product.py | 2 +- 7 files changed, 121 insertions(+), 30 deletions(-) create mode 100644 erpnext/portal/doctype/products_settings/test_products_settings.js create mode 100644 erpnext/portal/doctype/products_settings/test_products_settings.py diff --git a/erpnext/portal/doctype/products_settings/products_settings.json b/erpnext/portal/doctype/products_settings/products_settings.json index 90de96c8443..2d025cfe650 100644 --- a/erpnext/portal/doctype/products_settings/products_settings.json +++ b/erpnext/portal/doctype/products_settings/products_settings.json @@ -1,17 +1,23 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, + "beta": 0, "creation": "2016-04-22 09:11:55.272398", "custom": 0, "docstatus": 0, "doctype": "DocType", "document_type": "", + "editable_grid": 0, + "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "description": "If checked, the Home page will be the default Item Group for the website", "fieldname": "home_page_is_products", "fieldtype": "Check", @@ -19,7 +25,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Home Page is Products", "length": 0, "no_copy": 0, @@ -28,6 +36,7 @@ "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, @@ -35,16 +44,20 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "products_as_list", "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 Products as a List", "length": 0, "no_copy": 0, @@ -53,6 +66,39 @@ "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, + "default": "6", + "fieldname": "products_per_page", + "fieldtype": "Int", + "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": "Products per Page", + "length": 0, + "no_copy": 0, + "options": "", + "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, @@ -60,16 +106,17 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "idx": 0, + "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2016-04-22 09:11:59.537639", + "modified": "2017-11-07 19:34:33.055048", "modified_by": "Administrator", "module": "Portal", "name": "Products Settings", @@ -100,7 +147,9 @@ "quick_entry": 1, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/portal/doctype/products_settings/test_products_settings.js b/erpnext/portal/doctype/products_settings/test_products_settings.js new file mode 100644 index 00000000000..b7049b37e18 --- /dev/null +++ b/erpnext/portal/doctype/products_settings/test_products_settings.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Products Settings", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Products Settings + () => frappe.tests.make('Products Settings', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/portal/doctype/products_settings/test_products_settings.py b/erpnext/portal/doctype/products_settings/test_products_settings.py new file mode 100644 index 00000000000..d04a0098829 --- /dev/null +++ b/erpnext/portal/doctype/products_settings/test_products_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestProductsSettings(unittest.TestCase): + pass diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index a4c377e8cc0..364f21abd5c 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -57,7 +57,7 @@ class ItemGroup(NestedSet, WebsiteGenerator): def get_context(self, context): context.show_search=True - context.page_length = 6 + context.page_length = cint(frappe.db.get_single_value('Products Settings', 'products_per_page')) or 6 context.search_link = '/product_search' start = int(frappe.form_dict.start or 0) @@ -81,24 +81,26 @@ def get_product_list_for_group(product_group=None, start=0, limit=10, search=Non child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(product_group)]) # base query - query = """select name, item_name, item_code, route, image, website_image, thumbnail, item_group, - description, web_long_description as website_description - from `tabItem` - where show_in_website = 1 - and disabled=0 - and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s) - and (variant_of = '' or variant_of is null) - and (item_group in ({child_groups}) - or name in (select parent from `tabWebsite Item Group` where item_group in ({child_groups}))) + query = """select I.name, I.item_name, I.item_code, I.route, I.image, I.website_image, I.thumbnail, I.item_group, + I.description, I.web_long_description as website_description, + case when (S.actual_qty - S.reserved_qty) > 0 then 1 else 0 end as in_stock + from `tabItem` I + left join tabBin S on I.item_code = S.item_code and I.website_warehouse = S.warehouse + where I.show_in_website = 1 + and I.disabled = 0 + and (I.end_of_life is null or I.end_of_life='0000-00-00' or I.end_of_life > %(today)s) + and (I.variant_of = '' or I.variant_of is null) + and (I.item_group in ({child_groups}) + or I.name in (select parent from `tabWebsite Item Group` where item_group in ({child_groups}))) """.format(child_groups=child_groups) # search term condition if search: - query += """ and (web_long_description like %(search)s - or item_name like %(search)s - or name like %(search)s)""" + query += """ and (I.web_long_description like %(search)s + or I.item_name like %(search)s + or I.name like %(search)s)""" search = "%" + cstr(search) + "%" - query += """order by weightage desc, item_name, modified desc limit %s, %s""" % (start, limit) + query += """order by I.weightage desc, in_stock desc, I.item_name limit %s, %s""" % (start, limit) data = frappe.db.sql(query, {"product_group": product_group,"search": search, "today": nowdate()}, as_dict=1) diff --git a/erpnext/templates/includes/products_as_grid.html b/erpnext/templates/includes/products_as_grid.html index 7a15c1ffe35..b2437d3393f 100644 --- a/erpnext/templates/includes/products_as_grid.html +++ b/erpnext/templates/includes/products_as_grid.html @@ -3,8 +3,13 @@
- {{ product_image_square(thumbnail or website_image) }} -
{{ item_name }}
+ {{ product_image_square(thumbnail or website_image) }} +
{{ item_name }}
+ {% if in_stock %} +
{{ _("In stock") }}
+ {% else %} +
{{ _("Not in stock") }}
+ {% endif %}
diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py index 49f321dd9a1..a872f195109 100644 --- a/erpnext/templates/pages/product_search.py +++ b/erpnext/templates/pages/product_search.py @@ -17,23 +17,25 @@ def get_product_list(search=None, start=0, limit=12): # limit = 12 because we show 12 items in the grid view # base query - query = """select name, item_name, item_code, route, website_image, thumbnail, item_group, - description, web_long_description as website_description - from `tabItem` - where (show_in_website = 1 or show_variant_in_website = 1) - and disabled=0 - and (end_of_life is null or end_of_life='0000-00-00' or end_of_life > %(today)s)""" + query = """select I.name, I.item_name, I.item_code, I.route, I.website_image, I.thumbnail, I.item_group, + I.description, I.web_long_description as website_description, + case when (S.actual_qty - S.reserved_qty) > 0 then 1 else 0 end as in_stock + from `tabItem` I + left join tabBin S on I.item_code = S.item_code and I.website_warehouse = S.warehouse + where (I.show_in_website = 1 or I.show_variant_in_website = 1) + and I.disabled = 0 + and (I.end_of_life is null or I.end_of_life='0000-00-00' or I.end_of_life > %(today)s)""" # search term condition if search: - query += """ and (web_long_description like %(search)s - or description like %(search)s - or item_name like %(search)s - or name like %(search)s)""" + query += """ and (I.web_long_description like %(search)s + or I.description like %(search)s + or I.item_name like %(search)s + or I.name like %(search)s)""" search = "%" + cstr(search) + "%" # order by - query += """ order by weightage desc, idx desc, modified desc limit %s, %s""" % (cint(start), cint(limit)) + query += """ order by I.weightage desc, in_stock desc, I.item_name limit %s, %s""" % (cint(start), cint(limit)) data = frappe.db.sql(query, { "search": search, diff --git a/erpnext/utilities/product.py b/erpnext/utilities/product.py index 1ad8b6e5ee5..10366be6ec4 100644 --- a/erpnext/utilities/product.py +++ b/erpnext/utilities/product.py @@ -16,7 +16,7 @@ def get_qty_in_stock(item_code, item_warehouse_field): warehouse = frappe.db.get_value("Item", template_item_code, item_warehouse_field) if warehouse: - stock_qty = frappe.db.sql("""select actual_qty from tabBin where + stock_qty = frappe.db.sql("""select GREATEST(actual_qty - reserved_qty, 0) from tabBin where item_code=%s and warehouse=%s""", (item_code, warehouse)) if stock_qty: in_stock = stock_qty[0][0] > 0 and 1 or 0 From b6096057c6d0d327a65fba09038aaf557fa211b3 Mon Sep 17 00:00:00 2001 From: Britlog Date: Fri, 17 Nov 2017 07:11:35 +0100 Subject: [PATCH 122/164] Hide cart icon and badge count after logging out (#11530) --- erpnext/public/js/shopping_cart.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/public/js/shopping_cart.js b/erpnext/public/js/shopping_cart.js index e4e7440ebba..0a3e0af29d3 100644 --- a/erpnext/public/js/shopping_cart.js +++ b/erpnext/public/js/shopping_cart.js @@ -65,6 +65,9 @@ $.extend(shopping_cart, { set_cart_count: function() { var cart_count = getCookie("cart_count"); + if(frappe.session.user==="Guest") { + cart_count = 0; + } if(cart_count) { $(".shopping-cart").toggleClass('hidden', false); From d81e9f30dd30b860a176bafccb709ea1cc044a42 Mon Sep 17 00:00:00 2001 From: hiousi Date: Fri, 17 Nov 2017 07:12:24 +0100 Subject: [PATCH 123/164] [fix] issue #11456 (#11612) using bench export-fixtures create a erpnext/fixtures/web_form.json file see : https://github.com/frappe/erpnext/issues/11456#issuecomment-344846063 --- erpnext/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 44a3b18f78d..d9294283776 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -51,7 +51,7 @@ email_append_to = ["Job Applicant", "Lead", "Opportunity", "Issue"] calendars = ["Task", "Production Order", "Leave Application", "Sales Order", "Holiday List"] -fixtures = ["Web Form"] + domains = { 'Distribution': 'erpnext.domains.distribution', From 744ff0010baa3e8e5546240389ffbfd766d71477 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Fri, 17 Nov 2017 12:00:29 +0530 Subject: [PATCH 124/164] Variant report (#11618) * Item Variant Details Report * remove queries from inside for loop * make attribute value map * Update item_variant_details.py --- erpnext/config/stock.py | 6 + erpnext/stock/doctype/item/item.js | 4 + .../report/item_variant_details/__init__.py | 0 .../item_variant_details.js | 21 ++ .../item_variant_details.json | 44 +++++ .../item_variant_details.py | 180 ++++++++++++++++++ 6 files changed, 255 insertions(+) create mode 100644 erpnext/stock/report/item_variant_details/__init__.py create mode 100644 erpnext/stock/report/item_variant_details/item_variant_details.js create mode 100644 erpnext/stock/report/item_variant_details/item_variant_details.json create mode 100644 erpnext/stock/report/item_variant_details/item_variant_details.py diff --git a/erpnext/config/stock.py b/erpnext/config/stock.py index cb17deb9bf7..e0207d050d2 100644 --- a/erpnext/config/stock.py +++ b/erpnext/config/stock.py @@ -268,6 +268,12 @@ def get_data(): "name": "Itemwise Recommended Reorder Level", "doctype": "Item" }, + { + "type": "report", + "is_query_report": True, + "name": "Item Variant Details", + "doctype": "Item" + } ] }, { diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index a71e1eadbb9..f670e946cda 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -57,6 +57,10 @@ frappe.ui.form.on("Item", { frappe.set_route("List", "Item", {"variant_of": frm.doc.name}); }, __("View")); + frm.add_custom_button(__("Variant Details Report"), function() { + frappe.set_route("query-report", "Item Variant Details", {"item": frm.doc.name}); + }, __("View")); + if(frm.doc.variant_based_on==="Item Attribute") { frm.add_custom_button(__("Single Variant"), function() { erpnext.item.show_single_variant_dialog(frm); diff --git a/erpnext/stock/report/item_variant_details/__init__.py b/erpnext/stock/report/item_variant_details/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/stock/report/item_variant_details/item_variant_details.js b/erpnext/stock/report/item_variant_details/item_variant_details.js new file mode 100644 index 00000000000..78eab4050c1 --- /dev/null +++ b/erpnext/stock/report/item_variant_details/item_variant_details.js @@ -0,0 +1,21 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["Item Variant Details"] = { + "filters": [ + { + reqd: 1, + default: "", + options: "Item", + label: __("Item"), + fieldname: "item", + fieldtype: "Link", + get_query: () => { + return { + filters: { "has_variants": 1 } + } + } + } + ] +} diff --git a/erpnext/stock/report/item_variant_details/item_variant_details.json b/erpnext/stock/report/item_variant_details/item_variant_details.json new file mode 100644 index 00000000000..1d279039b40 --- /dev/null +++ b/erpnext/stock/report/item_variant_details/item_variant_details.json @@ -0,0 +1,44 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2017-11-16 06:05:36.132547", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2017-11-16 06:24:10.818276", + "modified_by": "Administrator", + "module": "Stock", + "name": "Item Variant Details", + "owner": "Administrator", + "ref_doctype": "Item", + "report_name": "Item Variant Details", + "report_type": "Script Report", + "roles": [ + { + "role": "Maintenance User" + }, + { + "role": "Accounts User" + }, + { + "role": "Stock User" + }, + { + "role": "Stock Manager" + }, + { + "role": "Purchase User" + }, + { + "role": "Sales User" + }, + { + "role": "Manufacturing User" + }, + { + "role": "Item Manager" + } + ] +} \ No newline at end of file diff --git a/erpnext/stock/report/item_variant_details/item_variant_details.py b/erpnext/stock/report/item_variant_details/item_variant_details.py new file mode 100644 index 00000000000..67b6b5f2a0e --- /dev/null +++ b/erpnext/stock/report/item_variant_details/item_variant_details.py @@ -0,0 +1,180 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ + +def execute(filters=None): + columns = get_columns(filters.item) + data = get_data(filters.item) + return columns, data + +def get_data(item): + if not item: + return [] + item_dicts = [] + + variant_results = frappe.db.sql("""select name from `tabItem` + where variant_of = %s""", item, as_dict=1) + variants = ",".join(['"' + variant['name'] + '"' for variant in variant_results]) + + order_count_map = get_open_sales_orders_map(variants) + stock_details_map = get_stock_details_map(variants) + buying_price_map = get_buying_price_map(variants) + selling_price_map = get_selling_price_map(variants) + attr_val_map = get_attribute_values_map(variants) + + attribute_list = [d[0] for d in frappe.db.sql("""select attribute + from `tabItem Variant Attribute` + where parent in ({variants}) group by attribute""".format(variants=variants))] + + # Prepare dicts + variant_dicts = [{"variant_name": d['name']} for d in variant_results] + for item_dict in variant_dicts: + name = item_dict["variant_name"] + + for d in attribute_list: + item_dict[d] = attr_val_map[name][d] + + item_dict["Open Orders"] = order_count_map.get(name) or 0 + + if stock_details_map.get(name): + item_dict["Inventory"] = stock_details_map.get(name)["Inventory"] or 0 + item_dict["In Production"] = stock_details_map.get(name)["In Production"] or 0 + item_dict["Available Selling"] = stock_details_map.get(name)["Available Selling"] or 0 + else: + item_dict["Inventory"] = item_dict["In Production"] = item_dict["Available Selling"] = 0 + + item_dict["Avg. Buying Price List Rate"] = buying_price_map.get(name) or 0 + item_dict["Avg. Selling Price List Rate"] = selling_price_map.get(name) or 0 + + item_dicts.append(item_dict) + + return item_dicts + +def get_columns(item): + columns = [{ + "fieldname": "variant_name", + "label": "Variant", + "fieldtype": "Link", + "options": "Item", + "width": 200 + }] + + item_doc = frappe.get_doc("Item", item) + + for d in item_doc.attributes: + columns.append(d.attribute + ":Data:100") + + columns += [_("Avg. Buying Price List Rate") + ":Currency:110", _("Avg. Selling Price List Rate") + ":Currency:110", + _("Inventory") + ":Float:100", _("In Production") + ":Float:100", + _("Open Orders") + ":Float:100", _("Available Selling") + ":Float:100" + ] + + return columns + +def get_open_sales_orders_map(variants): + open_sales_orders = frappe.db.sql(""" + select + count(*) as count, + item_code + from + `tabSales Order Item` + where + docstatus = 1 and + qty > ifnull(delivered_qty, 0) and + item_code in ({variants}) + group by + item_code + """.format(variants=variants), as_dict=1) + + order_count_map = {} + for d in open_sales_orders: + order_count_map[d["item_code"]] = d["count"] + + return order_count_map + +def get_stock_details_map(variants): + stock_details = frappe.db.sql(""" + select + sum(planned_qty) as planned_qty, + sum(actual_qty) as actual_qty, + sum(projected_qty) as projected_qty, + item_code + from + `tabBin` + where + item_code in ({variants}) + group by + item_code + """.format(variants=variants), as_dict=1) + + stock_details_map = {} + for d in stock_details: + name = d["item_code"] + stock_details_map[name] = { + "Inventory" :d["actual_qty"], + "In Production" :d["planned_qty"], + "Available Selling" :d["projected_qty"] + } + + return stock_details_map + +def get_buying_price_map(variants): + buying = frappe.db.sql(""" + select + avg(price_list_rate) as avg_rate, + item_code + from + `tabItem Price` + where + item_code in ({variants}) and buying=1 + group by + item_code + """.format(variants=variants), as_dict=1) + + buying_price_map = {} + for d in buying: + buying_price_map[d["item_code"]] = d["avg_rate"] + + return buying_price_map + +def get_selling_price_map(variants): + selling = frappe.db.sql(""" + select + avg(price_list_rate) as avg_rate, + item_code + from + `tabItem Price` + where + item_code in ({variants}) and selling=1 + group by + item_code + """.format(variants=variants), as_dict=1) + + selling_price_map = {} + for d in selling: + selling_price_map[d["item_code"]] = d["avg_rate"] + + return selling_price_map + +def get_attribute_values_map(variants): + list_attr = frappe.db.sql(""" + select + attribute, attribute_value, parent + from + `tabItem Variant Attribute` + where + parent in ({variants}) + """.format(variants=variants), as_dict=1) + + attr_val_map = {} + for d in list_attr: + name = d["parent"] + if not attr_val_map.get(name): + attr_val_map[name] = {} + + attr_val_map[name][d["attribute"]] = d["attribute_value"] + + return attr_val_map From 58dccf38c55aae3bcbf40063e27323990fcdbfbf Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 17 Nov 2017 12:12:34 +0530 Subject: [PATCH 125/164] [fix] for tests --- .../patches/v8_0/update_sales_cost_in_project.py | 5 +---- erpnext/setup/setup_wizard/test_setup_wizard.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/erpnext/patches/v8_0/update_sales_cost_in_project.py b/erpnext/patches/v8_0/update_sales_cost_in_project.py index 8f3aa262410..4f89ba036d1 100644 --- a/erpnext/patches/v8_0/update_sales_cost_in_project.py +++ b/erpnext/patches/v8_0/update_sales_cost_in_project.py @@ -1,6 +1,3 @@ -# Copyright (c) 2013, Frappé Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - from __future__ import unicode_literals import frappe @@ -9,4 +6,4 @@ def execute(): update `tabProject` p set total_sales_cost = ifnull((select sum(base_grand_total) from `tabSales Order` where project=p.name and docstatus=1), 0) - """) + """) \ No newline at end of file diff --git a/erpnext/setup/setup_wizard/test_setup_wizard.py b/erpnext/setup/setup_wizard/test_setup_wizard.py index 97650f2d24f..313039b2a85 100644 --- a/erpnext/setup/setup_wizard/test_setup_wizard.py +++ b/erpnext/setup/setup_wizard/test_setup_wizard.py @@ -30,14 +30,14 @@ def run_setup_wizard_test(): time.sleep(1) driver.click(".next-btn") - # Profile slide - driver.set_field("full_name", "Great Tester") - driver.set_field("email", "great@example.com") - driver.set_field("password", "test") - driver.wait_for_ajax(True) - time.sleep(1) - driver.click(".next-btn") - time.sleep(1) + # # Profile slide + # driver.set_field("full_name", "Great Tester") + # driver.set_field("email", "great@example.com") + # driver.set_field("password", "test") + # driver.wait_for_ajax(True) + # time.sleep(1) + # driver.click(".next-btn") + # time.sleep(1) # domain slide driver.set_select("domain", "Manufacturing") From 1783549e758e8137fa53449100150fbbc2996092 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 17 Nov 2017 12:20:07 +0530 Subject: [PATCH 126/164] Minor fixes in patch --- erpnext/patches/v9_1/create_issue_opportunity_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/patches/v9_1/create_issue_opportunity_type.py b/erpnext/patches/v9_1/create_issue_opportunity_type.py index af7ee5d6c3b..5b3819b956b 100644 --- a/erpnext/patches/v9_1/create_issue_opportunity_type.py +++ b/erpnext/patches/v9_1/create_issue_opportunity_type.py @@ -25,7 +25,7 @@ def execute(): for opts in (('Issue', 'issue_type', 'Issue Type'), ('Opportunity', 'opportunity_type', 'Opportunity Type')): for d in frappe.db.sql('select distinct {0} from `tab{1}`'.format(opts[1], opts[0])): - if not frappe.db.exists(opts[2], d[0]): + if d[0] and not frappe.db.exists(opts[2], d[0]): frappe.get_doc(dict(doctype = opts[2], name=d[0])).insert() # fixtures From 877e1bb377e08861d06645bffd38a6e44236592b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 17 Nov 2017 12:27:43 +0530 Subject: [PATCH 127/164] Post GL Entry based on rounded total in Sales/Purchase Invoice (#11542) --- .../purchase_invoice/purchase_invoice.js | 3 +- .../purchase_invoice/purchase_invoice.json | 97 ++++++++++++++++++- .../purchase_invoice/purchase_invoice.py | 13 ++- .../purchase_invoice/test_purchase_invoice.py | 29 +++--- .../doctype/sales_invoice/sales_invoice.py | 7 +- .../sales_invoice/test_sales_invoice.py | 20 ++-- erpnext/controllers/accounts_controller.py | 12 ++- erpnext/controllers/selling_controller.py | 14 +-- erpnext/controllers/taxes_and_totals.py | 63 +++++++----- .../public/js/controllers/taxes_and_totals.js | 55 +++++++---- .../global_defaults/global_defaults.py | 5 +- 11 files changed, 232 insertions(+), 86 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index b9a7dae55f5..ff58becb08f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -17,12 +17,13 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ if(!this.frm.doc.supplier && this.frm.doc.credit_to) { this.frm.set_df_property("credit_to", "print_hide", 0); } + } else { + this.frm.set_value("disable_rounded_total", frappe.sys_defaults.disable_rounded_total); } // formatter for material request item this.frm.set_indicator_formatter('item_code', function(doc) { return (doc.qty<=doc.received_qty) ? "green" : "orange" }) - }, refresh: function(doc) { diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 51a099e629e..857f019bfbf 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2104,6 +2104,38 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.disable_rounded_total", + "fieldname": "base_rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -2229,6 +2261,38 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.disable_rounded_total", + "fieldname": "rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -2324,6 +2388,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "grand_total", + "fieldname": "disable_rounded_total", + "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": "Disable Rounded Total", + "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, @@ -3576,7 +3671,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-15 01:04:15.308603", + "modified": "2017-11-16 01:04:15.308603", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 78c5682ef87..626dd928273 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -77,8 +77,10 @@ class PurchaseInvoice(BuyingController): if not self.cash_bank_account and flt(self.paid_amount): frappe.throw(_("Cash or Bank Account is mandatory for making payment entry")) - if flt(self.paid_amount) + flt(self.write_off_amount) \ - - flt(self.grand_total) > 1/(10**(self.precision("base_grand_total") + 1)): + if (flt(self.paid_amount) + flt(self.write_off_amount) + - flt(self.get("rounded_total") or self.grand_total) + > 1/(10**(self.precision("base_grand_total") + 1))): + frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total""")) def create_remarks(self): @@ -359,9 +361,10 @@ class PurchaseInvoice(BuyingController): return gl_entries def make_supplier_gl_entry(self, gl_entries): - if self.grand_total: + grand_total = self.rounded_total or self.grand_total + if grand_total: # Didnot use base_grand_total to book rounding loss gle - grand_total_in_company_currency = flt(self.grand_total * self.conversion_rate, + grand_total_in_company_currency = flt(grand_total * self.conversion_rate, self.precision("grand_total")) gl_entries.append( self.get_gl_dict({ @@ -371,7 +374,7 @@ class PurchaseInvoice(BuyingController): "against": self.against_expense_account, "credit": grand_total_in_company_currency, "credit_in_account_currency": grand_total_in_company_currency \ - if self.party_account_currency==self.company_currency else self.grand_total, + if self.party_account_currency==self.company_currency else grand_total, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype, }, self.party_account_currency) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 474329fc9ad..baf016d5964 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -35,7 +35,7 @@ class TestPurchaseInvoice(unittest.TestCase): dl = wrapper expected_gl_entries = { - "_Test Payable - _TC": [0, 1512.30], + "_Test Payable - _TC": [0, 1512.0], "_Test Account Cost for Goods Sold - _TC": [1250, 0], "_Test Account Shipping Charges - _TC": [100, 0], "_Test Account Excise Duty - _TC": [140, 0], @@ -44,6 +44,7 @@ class TestPurchaseInvoice(unittest.TestCase): "_Test Account CST - _TC": [29.88, 0], "_Test Account VAT - _TC": [156.25, 0], "_Test Account Discount - _TC": [0, 168.03], + "Round Off - _TC": [0, 0.3] } gl_entries = frappe.db.sql("""select account, debit, credit from `tabGL Entry` where voucher_type = 'Purchase Invoice' and voucher_no = %s""", dl.name, as_dict=1) @@ -233,6 +234,7 @@ class TestPurchaseInvoice(unittest.TestCase): jv.submit() pi = frappe.copy_doc(test_records[0]) + pi.disable_rounded_total = 1 pi.append("advances", { "reference_type": "Journal Entry", "reference_name": jv.name, @@ -242,6 +244,13 @@ class TestPurchaseInvoice(unittest.TestCase): "remarks": jv.remark }) pi.insert() + + self.assertEqual(pi.outstanding_amount, 1212.30) + + pi.disable_rounded_total = 0 + pi.save() + self.assertEqual(pi.outstanding_amount, 1212.0) + pi.submit() pi.load_from_db() @@ -249,8 +258,6 @@ class TestPurchaseInvoice(unittest.TestCase): where reference_type='Purchase Invoice' and reference_name=%s and debit_in_account_currency=300""", pi.name)) - self.assertEqual(pi.outstanding_amount, 1212.30) - pi.cancel() self.assertFalse(frappe.db.sql("""select name from `tabJournal Entry Account` @@ -491,7 +498,7 @@ class TestPurchaseInvoice(unittest.TestCase): pi.load_from_db() #check outstanding after advance allocation - self.assertEqual(flt(pi.outstanding_amount), flt(pi.grand_total - pi.total_advance)) + self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total - pi.total_advance)) #added to avoid Document has been modified exception jv = frappe.get_doc("Journal Entry", jv.name) @@ -499,7 +506,7 @@ class TestPurchaseInvoice(unittest.TestCase): pi.load_from_db() #check outstanding after advance cancellation - self.assertEqual(flt(pi.outstanding_amount), flt(pi.grand_total + pi.total_advance)) + self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total + pi.total_advance)) def test_outstanding_amount_after_advance_payment_entry_cancelation(self): pe = frappe.get_doc({ @@ -521,7 +528,7 @@ class TestPurchaseInvoice(unittest.TestCase): }) pe.insert() pe.submit() - + pi = frappe.copy_doc(test_records[0]) pi.is_pos = 0 pi.append("advances", { @@ -534,19 +541,19 @@ class TestPurchaseInvoice(unittest.TestCase): }) pi.insert() pi.submit() - + pi.load_from_db() #check outstanding after advance allocation - self.assertEqual(flt(pi.outstanding_amount), flt(pi.grand_total - pi.total_advance)) - + self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total - pi.total_advance)) + #added to avoid Document has been modified exception pe = frappe.get_doc("Payment Entry", pe.name) pe.cancel() - + pi.load_from_db() #check outstanding after advance cancellation - self.assertEqual(flt(pi.outstanding_amount), flt(pi.grand_total + pi.total_advance)) + self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total + pi.total_advance)) def unlink_payment_on_cancel_of_invoice(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index db9969d133e..ee2b5542fbf 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -632,9 +632,10 @@ class SalesInvoice(SellingController): return gl_entries def make_customer_gl_entry(self, gl_entries): - if self.grand_total: + grand_total = self.rounded_total or self.grand_total + if grand_total: # Didnot use base_grand_total to book rounding loss gle - grand_total_in_company_currency = flt(self.grand_total * self.conversion_rate, + grand_total_in_company_currency = flt(grand_total * self.conversion_rate, self.precision("grand_total")) gl_entries.append( @@ -645,7 +646,7 @@ class SalesInvoice(SellingController): "against": self.against_income_account, "debit": grand_total_in_company_currency, "debit_in_account_currency": grand_total_in_company_currency \ - if self.party_account_currency==self.company_currency else self.grand_total, + if self.party_account_currency==self.company_currency else grand_total, "against_voucher": self.return_against if cint(self.is_return) else self.name, "against_voucher_type": self.doctype }, self.party_account_currency) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 50d2ce810b7..12b556b5b4c 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -546,7 +546,7 @@ class TestSalesInvoice(unittest.TestCase): def test_outstanding(self): w = self.make() - self.assertEquals(w.outstanding_amount, w.base_grand_total) + self.assertEquals(w.outstanding_amount, w.base_rounded_total) def test_payment(self): w = self.make() @@ -560,7 +560,7 @@ class TestSalesInvoice(unittest.TestCase): jv.insert() jv.submit() - self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 161.8) + self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 162.0) link_data = get_dynamic_link_map().get('Sales Invoice', []) link_doctypes = [d.parent for d in link_data] @@ -569,7 +569,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertTrue(link_doctypes.index('GL Entry') > link_doctypes.index('Journal Entry Account')) jv.cancel() - self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 561.8) + self.assertEquals(frappe.db.get_value("Sales Invoice", w.name, "outstanding_amount"), 562.0) def test_sales_invoice_gl_entry_without_perpetual_inventory(self): si = frappe.copy_doc(test_records[1]) @@ -848,7 +848,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertTrue(frappe.db.sql("""select name from `tabJournal Entry Account` where reference_name=%s and credit_in_account_currency=300""", si.name)) - self.assertEqual(si.outstanding_amount, 261.8) + self.assertEqual(si.outstanding_amount, 262.0) si.cancel() @@ -1152,7 +1152,8 @@ class TestSalesInvoice(unittest.TestCase): si.load_from_db() #check outstanding after advance allocation - self.assertEqual(flt(si.outstanding_amount), flt(si.grand_total - si.total_advance, si.precision("outstanding_amount"))) + self.assertEqual(flt(si.outstanding_amount), + flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount"))) #added to avoid Document has been modified exception jv = frappe.get_doc("Journal Entry", jv.name) @@ -1160,7 +1161,8 @@ class TestSalesInvoice(unittest.TestCase): si.load_from_db() #check outstanding after advance cancellation - self.assertEqual(flt(si.outstanding_amount), flt(si.grand_total + si.total_advance, si.precision("outstanding_amount"))) + self.assertEqual(flt(si.outstanding_amount), + flt(si.rounded_total + si.total_advance, si.precision("outstanding_amount"))) def test_outstanding_amount_after_advance_payment_entry_cancelation(self): pe = frappe.get_doc({ @@ -1199,7 +1201,8 @@ class TestSalesInvoice(unittest.TestCase): si.load_from_db() #check outstanding after advance allocation - self.assertEqual(flt(si.outstanding_amount), flt(si.grand_total - si.total_advance, si.precision("outstanding_amount"))) + self.assertEqual(flt(si.outstanding_amount), + flt(si.rounded_total - si.total_advance, si.precision("outstanding_amount"))) #added to avoid Document has been modified exception pe = frappe.get_doc("Payment Entry", pe.name) @@ -1207,7 +1210,8 @@ class TestSalesInvoice(unittest.TestCase): si.load_from_db() #check outstanding after advance cancellation - self.assertEqual(flt(si.outstanding_amount), flt(si.grand_total + si.total_advance, si.precision("outstanding_amount"))) + self.assertEqual(flt(si.outstanding_amount), + flt(si.rounded_total + si.total_advance, si.precision("outstanding_amount"))) def test_multiple_uom_in_selling(self): frappe.db.sql("""delete from `tabItem Price` diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 74a90004c43..429d6eb425e 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -66,9 +66,9 @@ class AccountsController(TransactionBase): if cint(is_paid) == 1: if flt(self.paid_amount) == 0 and flt(self.outstanding_amount) > 0: if self.cash_bank_account: - self.paid_amount = flt(flt(self.grand_total) - flt(self.write_off_amount), - self.precision("paid_amount")) - self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, self.precision("base_paid_amount")) + self.paid_amount = flt(flt(self.outstanding_amount), self.precision("paid_amount")) + self.base_paid_amount = flt(self.paid_amount * self.conversion_rate, + self.precision("base_paid_amount")) else: # show message that the amount is not paid self.paid_amount = 0 @@ -598,6 +598,12 @@ class AccountsController(TransactionBase): for item in duplicate_list: self.remove(item) + def is_rounded_total_disabled(self): + if self.meta.get_field("disable_rounded_total"): + return self.disable_rounded_total + else: + return frappe.db.get_single_value("Global Defaults", "disable_rounded_total") + @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, ["tax_rate", "account_name"], as_dict=True) diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index c1028a598dd..0e15eee521c 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -28,8 +28,7 @@ class SellingController(StockController): super(SellingController, self).onload() if self.doctype in ("Sales Order", "Delivery Note", "Sales Invoice"): for item in self.get("items"): - item.update(get_bin_details(item.item_code, - item.warehouse)) + item.update(get_bin_details(item.item_code, item.warehouse)) def validate(self): super(SellingController, self).validate() @@ -114,14 +113,15 @@ class SellingController(StockController): def set_total_in_words(self): from frappe.utils import money_in_words - disable_rounded_total = cint(frappe.db.get_value("Global Defaults", None, "disable_rounded_total")) if self.meta.get_field("base_in_words"): - self.base_in_words = money_in_words(disable_rounded_total and - abs(self.base_grand_total) or abs(self.base_rounded_total), self.company_currency) + base_amount = abs(self.base_grand_total + if self.is_rounded_total_disabled() else self.base_rounded_total) + self.base_in_words = money_in_words(base_amount, self.company_currency) + if self.meta.get_field("in_words"): - self.in_words = money_in_words(disable_rounded_total and - abs(self.grand_total) or abs(self.rounded_total), self.currency) + amount = abs(self.grand_total if self.is_rounded_total_disabled() else self.rounded_total) + self.in_words = money_in_words(amount, self.currency) def calculate_commission(self): if self.meta.get_field("commission_rate"): diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index e9672df0df5..2b2191c0d91 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -328,14 +328,18 @@ class calculate_taxes_and_totals(object): self.set_rounded_total() def set_rounded_total(self): - if frappe.db.get_single_value("Global Defaults", "disable_rounded_total"): - self.doc.rounded_total = self.doc.base_rounded_total = 0 - return - if self.doc.meta.get_field("rounded_total"): + if self.doc.is_rounded_total_disabled(): + self.doc.rounded_total = self.doc.base_rounded_total = 0 + return + self.doc.rounded_total = round_based_on_smallest_currency_fraction(self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total")) + #if print_in_rate is set, we would have already calculated rounding adjustment + self.doc.rounding_adjustment += flt(self.doc.rounded_total - self.doc.grand_total, + self.doc.precision("rounding_adjustment")) + if self.doc.meta.get_field("base_rounded_total"): company_currency = erpnext.get_company_currency(self.doc.company) @@ -343,6 +347,9 @@ class calculate_taxes_and_totals(object): round_based_on_smallest_currency_fraction(self.doc.base_grand_total, company_currency, self.doc.precision("base_rounded_total")) + self.doc.base_rounding_adjustment += flt(self.doc.base_rounded_total - self.doc.base_grand_total, + self.doc.precision("base_rounding_adjustment")) + def _cleanup(self): for tax in self.doc.get("taxes"): tax.item_wise_tax_detail = json.dumps(tax.item_wise_tax_detail, separators=(',', ':')) @@ -404,7 +411,8 @@ class calculate_taxes_and_totals(object): actual_tax_amount = flt(actual_taxes_dict.get(tax.row_id, 0)) * flt(tax.rate) / 100 actual_taxes_dict.setdefault(tax.idx, actual_tax_amount) - return flt(self.doc.grand_total - sum(actual_taxes_dict.values()), self.doc.precision("grand_total")) + return flt(self.doc.grand_total - sum(actual_taxes_dict.values()), + self.doc.precision("grand_total")) def calculate_total_advance(self): @@ -442,30 +450,31 @@ class calculate_taxes_and_totals(object): self.doc.round_floats_in(self.doc, ["grand_total", "total_advance", "write_off_amount"]) self._set_in_company_currency(self.doc, ['write_off_amount']) - if self.doc.party_account_currency == self.doc.currency: - total_amount_to_pay = flt(self.doc.grand_total - self.doc.total_advance - - flt(self.doc.write_off_amount), self.doc.precision("grand_total")) - else: - total_amount_to_pay = flt(flt(self.doc.grand_total * - self.doc.conversion_rate, self.doc.precision("grand_total")) - self.doc.total_advance - - flt(self.doc.base_write_off_amount), self.doc.precision("grand_total")) + if self.doc.doctype in ["Sales Invoice", "Purchase Invoice"]: + grand_total = self.doc.rounded_total or self.doc.grand_total + if self.doc.party_account_currency == self.doc.currency: + total_amount_to_pay = flt(grand_total - self.doc.total_advance + - flt(self.doc.write_off_amount), self.doc.precision("grand_total")) + else: + total_amount_to_pay = flt(flt(grand_total * + self.doc.conversion_rate, self.doc.precision("grand_total")) - self.doc.total_advance + - flt(self.doc.base_write_off_amount), self.doc.precision("grand_total")) - if self.doc.doctype == "Sales Invoice": self.doc.round_floats_in(self.doc, ["paid_amount"]) - self.calculate_write_off_amount() - self.calculate_change_amount() - + change_amount = 0 + + if self.doc.doctype == "Sales Invoice": + self.calculate_write_off_amount() + self.calculate_change_amount() + change_amount = self.doc.change_amount \ + if self.doc.party_account_currency == self.doc.currency else self.doc.base_change_amount + paid_amount = self.doc.paid_amount \ if self.doc.party_account_currency == self.doc.currency else self.doc.base_paid_amount - - change_amount = self.doc.change_amount \ - if self.doc.party_account_currency == self.doc.currency else self.doc.base_change_amount - self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) + - flt(change_amount), self.doc.precision("outstanding_amount")) - elif self.doc.doctype == "Purchase Invoice": - self.doc.outstanding_amount = flt(total_amount_to_pay, self.doc.precision("outstanding_amount")) + self.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) + flt(change_amount), + self.doc.precision("outstanding_amount")) def calculate_paid_amount(self): paid_amount = base_paid_amount = 0.0 @@ -485,7 +494,9 @@ class calculate_taxes_and_totals(object): def calculate_change_amount(self): self.doc.change_amount = 0.0 self.doc.base_change_amount = 0.0 - if self.doc.paid_amount > self.doc.grand_total and not self.doc.is_return \ + + if self.doc.doctype == "Sales Invoice" \ + and self.doc.paid_amount > self.doc.grand_total and not self.doc.is_return \ and any([d.type == "Cash" for d in self.doc.payments]): self.doc.change_amount = flt(self.doc.paid_amount - self.doc.grand_total + @@ -496,8 +507,8 @@ class calculate_taxes_and_totals(object): def calculate_write_off_amount(self): if flt(self.doc.change_amount) > 0: - self.doc.write_off_amount = flt(self.doc.grand_total - self.doc.paid_amount + self.doc.change_amount, - self.doc.precision("write_off_amount")) + self.doc.write_off_amount = flt(self.doc.grand_total - self.doc.paid_amount + + self.doc.change_amount, self.doc.precision("write_off_amount")) self.doc.base_write_off_amount = flt(self.doc.write_off_amount * self.doc.conversion_rate, self.doc.precision("base_write_off_amount")) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 05c323bdc60..afdc87392ad 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -422,13 +422,27 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ frappe.model.round_floats_in(this.frm.doc, ["grand_total", "base_grand_total"]); // rounded totals - this.set_rounded_total() + this.set_rounded_total(); }, set_rounded_total: function() { + var disable_rounded_total = 0; + if(frappe.meta.get_docfield(this.frm.doc.doctype, "disable_rounded_total", this.frm.doc.name)) { + disable_rounded_total = this.frm.doc.disable_rounded_total; + } else if (frappe.sys_defaults.disable_rounded_total) { + disable_rounded_total = frappe.sys_defaults.disable_rounded_total; + } + if(disable_rounded_total) { + this.frm.doc.rounded_total = 0; + this.frm.doc.base_rounded_total = 0; + return; + } + if(frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total", this.frm.doc.name)) { this.frm.doc.rounded_total = round_based_on_smallest_currency_fraction(this.frm.doc.grand_total, this.frm.doc.currency, precision("rounded_total")); + this.frm.doc.rounding_adjustment += flt(this.frm.doc.rounded_total - this.frm.doc.grand_total, + precision("rounding_adjustment")); } if(frappe.meta.get_docfield(this.frm.doc.doctype, "base_rounded_total", this.frm.doc.name)) { var company_currency = this.get_company_currency(); @@ -436,6 +450,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ this.frm.doc.base_rounded_total = round_based_on_smallest_currency_fraction(this.frm.doc.base_grand_total, company_currency, precision("base_rounded_total")); + + this.frm.doc.base_rounding_adjustment += flt(this.frm.doc.base_rounded_total - + this.frm.doc.base_grand_total, precision("rounding_adjustment")); } }, @@ -560,20 +577,22 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ if(this.frm.doc.is_return || this.frm.doc.docstatus > 0) return; frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount"]); - if(this.frm.doc.party_account_currency == this.frm.doc.currency) { - var total_amount_to_pay = flt((this.frm.doc.grand_total - this.frm.doc.total_advance - - this.frm.doc.write_off_amount), precision("grand_total")); - } else { - var total_amount_to_pay = flt( - (flt(this.frm.doc.grand_total*this.frm.doc.conversion_rate, precision("grand_total")) - - this.frm.doc.total_advance - this.frm.doc.base_write_off_amount), - precision("base_grand_total") - ); - } - if(this.frm.doc.doctype == "Sales Invoice" || this.frm.doc.doctype == "Purchase Invoice") { + if(in_list(["Sales Invoice", "Purchase Invoice"], this.frm.doc.doctype)) { + var grand_total = this.frm.doc.rounded_total || this.frm.doc.grand_total; + + if(this.frm.doc.party_account_currency == this.frm.doc.currency) { + var total_amount_to_pay = flt((grand_total - this.frm.doc.total_advance + - this.frm.doc.write_off_amount), precision("grand_total")); + } else { + var total_amount_to_pay = flt( + (flt(grand_total*this.frm.doc.conversion_rate, precision("grand_total")) + - this.frm.doc.total_advance - this.frm.doc.base_write_off_amount), + precision("base_grand_total") + ); + } + frappe.model.round_floats_in(this.frm.doc, ["paid_amount"]); - this.set_in_company_currency(this.frm.doc, ["paid_amount"]); if(this.frm.refresh_field){ @@ -581,11 +600,10 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ this.frm.refresh_field("base_paid_amount"); } - if(this.frm.doc.doctype == "Sales Invoice"){ + if(this.frm.doc.doctype == "Sales Invoice") { this.set_default_payment(total_amount_to_pay, update_paid_amount); this.calculate_paid_amount(); } - this.calculate_change_amount(); var paid_amount = (this.frm.doc.party_account_currency == this.frm.doc.currency) ? @@ -593,9 +611,6 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ this.frm.doc.outstanding_amount = flt(total_amount_to_pay - flt(paid_amount) + flt(this.frm.doc.change_amount * this.frm.doc.conversion_rate), precision("outstanding_amount")); - - } else if(this.frm.doc.doctype == "Purchase Invoice") { - this.frm.doc.outstanding_amount = flt(total_amount_to_pay, precision("outstanding_amount")); } }, @@ -636,7 +651,9 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ calculate_change_amount: function(){ this.frm.doc.change_amount = 0.0; this.frm.doc.base_change_amount = 0.0; - if(this.frm.doc.paid_amount > this.frm.doc.grand_total && !this.frm.doc.is_return) { + if(this.frm.doc.doctype == "Sales Invoice" + && this.frm.doc.paid_amount > this.frm.doc.grand_total && !this.frm.doc.is_return) { + var payment_types = $.map(this.frm.doc.payments, function(d) { return d.type; }); if (in_list(payment_types, 'Cash')) { this.frm.doc.change_amount = flt(this.frm.doc.paid_amount - this.frm.doc.grand_total + diff --git a/erpnext/setup/doctype/global_defaults/global_defaults.py b/erpnext/setup/doctype/global_defaults/global_defaults.py index 9c6eb82def2..a39e246c683 100644 --- a/erpnext/setup/doctype/global_defaults/global_defaults.py +++ b/erpnext/setup/doctype/global_defaults/global_defaults.py @@ -57,7 +57,8 @@ class GlobalDefaults(Document): self.disable_rounded_total = cint(self.disable_rounded_total) # Make property setters to hide rounded total fields - for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note"): + for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note", + "Supplier Quotation", "Purchase Order"): make_property_setter(doctype, "base_rounded_total", "hidden", self.disable_rounded_total, "Check") make_property_setter(doctype, "base_rounded_total", "print_hide", 1, "Check") @@ -69,6 +70,6 @@ class GlobalDefaults(Document): # Make property setters to hide in words fields for doctype in ("Quotation", "Sales Order", "Sales Invoice", "Delivery Note", - "Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt"): + "Supplier Quotation", "Purchase Order", "Purchase Invoice", "Purchase Receipt"): make_property_setter(doctype, "in_words", "hidden", self.disable_in_words, "Check") make_property_setter(doctype, "in_words", "print_hide", self.disable_in_words, "Check") From 3499ba08df9abd21f99cefeb1c3cdf09dc56bfa0 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 17 Nov 2017 12:29:26 +0530 Subject: [PATCH 128/164] [fix] do not translate domains while creating db record (#11616) --- erpnext/patches.txt | 1 + .../v9_2/rename_translated_domains_in_en.py | 26 +++++++++++++++++++ .../setup/setup_wizard/install_fixtures.py | 12 ++++----- erpnext/setup/setup_wizard/setup_wizard.py | 6 +---- 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 erpnext/patches/v9_2/rename_translated_domains_in_en.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1ae99a3d3a3..e3d61d98856 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -460,3 +460,4 @@ erpnext.patches.v9_0.remove_non_existing_warehouse_from_stock_settings execute:frappe.delete_doc_if_exists("DocType", "Program Fee") erpnext.patches.v9_0.update_employee_loan_details erpnext.patches.v9_2.delete_healthcare_domain_default_items +erpnext.patches.v9_2.rename_translated_domains_in_en diff --git a/erpnext/patches/v9_2/rename_translated_domains_in_en.py b/erpnext/patches/v9_2/rename_translated_domains_in_en.py new file mode 100644 index 00000000000..88ffbb7a3d3 --- /dev/null +++ b/erpnext/patches/v9_2/rename_translated_domains_in_en.py @@ -0,0 +1,26 @@ +import frappe +from frappe import _ + +def execute(): + language = frappe.get_single("System Settings").language + + if language.startswith('en'): return + + all_domains = frappe.get_hooks("domains") + + for domain in all_domains: + translated_domain = _(domain, lang=language) + if frappe.db.exists("Domain", translated_domain): + frappe.rename_doc("Domain", translated_domain, domain, ignore_permissions=True, merge=True) + + domain_settings = frappe.get_single("Domain Settings") + active_domains = [d.domain for d in domain_settings.active_domains] + + for domain in active_domains: + domain = frappe.get_doc("Domain", domain) + domain.setup_domain() + + if int(frappe.db.get_single_value('System Settings', 'setup_complete')): + domain.setup_sidebar_items() + domain.setup_desktop_icons() + domain.set_default_portal_role() diff --git a/erpnext/setup/setup_wizard/install_fixtures.py b/erpnext/setup/setup_wizard/install_fixtures.py index e6a4a81959e..0f98214e5cf 100644 --- a/erpnext/setup/setup_wizard/install_fixtures.py +++ b/erpnext/setup/setup_wizard/install_fixtures.py @@ -14,12 +14,12 @@ default_lead_sources = ["Existing Customer", "Reference", "Advertisement", def install(country=None): records = [ # domains - { 'doctype': 'Domain', 'domain': _('Distribution')}, - { 'doctype': 'Domain', 'domain': _('Manufacturing')}, - { 'doctype': 'Domain', 'domain': _('Retail')}, - { 'doctype': 'Domain', 'domain': _('Services')}, - { 'doctype': 'Domain', 'domain': _('Education')}, - { 'doctype': 'Domain', 'domain': _('Healthcare')}, + { 'doctype': 'Domain', 'domain': 'Distribution'}, + { 'doctype': 'Domain', 'domain': 'Manufacturing'}, + { 'doctype': 'Domain', 'domain': 'Retail'}, + { 'doctype': 'Domain', 'domain': 'Services'}, + { 'doctype': 'Domain', 'domain': 'Education'}, + { 'doctype': 'Domain', 'domain': 'Healthcare'}, # Setup Progress {'doctype': "Setup Progress", "actions": [ diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 766f9b5223b..28e617faf75 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -40,7 +40,7 @@ def setup_complete(args=None): frappe.local.message_log = [] domain_settings = frappe.get_single('Domain Settings') - domain_settings.set_active_domains([_(args.get('domain'))]) + domain_settings.set_active_domains([args.get('domain')]) frappe.db.commit() login_as_first_user(args) @@ -186,10 +186,6 @@ def set_defaults(args): hr_settings.emp_created_by = "Naming Series" hr_settings.save() - domain_settings = frappe.get_doc("Domain Settings") - domain_settings.append('active_domains', dict(domain=_(args.get('domain')))) - domain_settings.save() - def create_feed_and_todo(): """update Activity feed and create todo for creation of item, customer, vendor""" add_info_comment(**{ From 6b70906deb848e2dbcb92c6fa3e6d100cc258b45 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 17 Nov 2017 12:54:32 +0530 Subject: [PATCH 129/164] Update purchase_invoice.py --- erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 4ff5c6e5c1c..0c8bfc002cb 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -361,7 +361,7 @@ class PurchaseInvoice(BuyingController): return gl_entries def make_supplier_gl_entry(self, gl_entries): - grand_total = self.rounded_total or self.grand_total + grand_total = self.rounded_total or self.grand_total if self.get("payment_schedule"): for d in self.get("payment_schedule"): payment_amount_in_company_currency = flt(d.payment_amount * self.conversion_rate, From 7fa111de450c8ab342f10639cf5751fd04bb09db Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 17 Nov 2017 12:55:08 +0530 Subject: [PATCH 130/164] Update sales_invoice.py --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index ee01011c879..5c067fea3dc 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -632,7 +632,7 @@ class SalesInvoice(SellingController): return gl_entries def make_customer_gl_entry(self, gl_entries): - grand_total = self.rounded_total or self.grand_total + grand_total = self.rounded_total or self.grand_total if self.get("payment_schedule"): for d in self.get("payment_schedule"): payment_amount_in_company_currency = flt(d.payment_amount * self.conversion_rate, From 44f7b157ffa0767abc67cd8418c878f33e7cdf01 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 17 Nov 2017 13:49:12 +0530 Subject: [PATCH 131/164] [fix] POS redirect issue --- erpnext/accounts/doctype/pos_settings/pos_settings.py | 7 ++----- erpnext/selling/page/point_of_sale/point_of_sale.js | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/pos_settings/pos_settings.py b/erpnext/accounts/doctype/pos_settings/pos_settings.py index 13a50042fb7..bdfd969df7c 100644 --- a/erpnext/accounts/doctype/pos_settings/pos_settings.py +++ b/erpnext/accounts/doctype/pos_settings/pos_settings.py @@ -12,8 +12,5 @@ class POSSettings(Document): def set_link_for_pos(self): link = 'pos' if self.use_pos_in_offline_mode else 'point-of-sale' - desktop_icon = frappe.db.get_value('Desktop Icon', - {'standard': 1, 'module_name': 'POS'}, 'name') - - if desktop_icon: - frappe.db.set_value('Desktop Icon', desktop_icon, 'link', link) \ No newline at end of file + frappe.db.sql(""" update `tabDesktop Icon` set link = '{0}' + where module_name like '%pos%'""".format(link)) \ No newline at end of file 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 adde913fb67..b167bcda6cc 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.js +++ b/erpnext/selling/page/point_of_sale/point_of_sale.js @@ -991,7 +991,7 @@ class POSItems { this.get_items({search_value: search_term, item_group }) .then(({ items, serial_no, batch_no, barcode }) => { - if (search_term) { + if (search_term && !barcode) { this.search_index[search_term] = items; } From 05ed86a00e5961d848b1ba2ba713eed31bb45970 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 17 Nov 2017 14:31:29 +0600 Subject: [PATCH 132/164] bumped to version 9.2.14 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index a55d0e7562a..d1e9417db14 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '9.2.13' +__version__ = '9.2.14' def get_default_company(user=None): '''Get default company for user''' From 30dc9a14c61a7cfee60bb0eadefb3213159312a8 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 17 Nov 2017 14:31:09 +0530 Subject: [PATCH 133/164] [feature] [refactor] Shipping Rule for Buying + Refactor (#11628) * Shipping rule for Buying * [refactor] shipping rule --- .../purchase_invoice/purchase_invoice.json | 7169 +++++++++-------- .../purchase_invoice/test_purchase_invoice.py | 34 + .../sales_invoice/test_sales_invoice.py | 33 + .../doctype/shipping_rule/shipping_rule.js | 12 + .../doctype/shipping_rule/shipping_rule.json | 451 +- .../doctype/shipping_rule/shipping_rule.py | 78 +- .../doctype/shipping_rule/test_records.json | 12 +- .../shipping_rule/test_shipping_rule.js | 2 + .../shipping_rule/test_shipping_rule.py | 35 + .../tests/test_shipping_rule_for_buying.js | 37 + .../purchase_order/purchase_order.json | 6345 ++++++++------- .../test_purchase_order_with_shipping_rule.js | 43 + .../supplier_quotation.json | 4735 +++++------ erpnext/controllers/accounts_controller.py | 21 + erpnext/controllers/buying_controller.py | 3 +- erpnext/controllers/selling_controller.py | 32 - erpnext/controllers/taxes_and_totals.py | 3 +- .../docs/assets/img/selling/shipping-rule.png | Bin 89566 -> 219666 bytes .../manual/en/selling/setup/shipping-rule.md | 4 +- erpnext/patches.txt | 1 + ...ipping_type_for_existing_shipping_rules.py | 18 + erpnext/public/js/controllers/buying.js | 8 + erpnext/public/js/controllers/transaction.js | 41 +- erpnext/selling/sales_common.js | 22 +- erpnext/shopping_cart/test_shopping_cart.py | 1 + .../purchase_receipt/purchase_receipt.json | 6147 +++++++------- 26 files changed, 13041 insertions(+), 12246 deletions(-) create mode 100644 erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js create mode 100644 erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js create mode 100644 erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 857f019bfbf..9837f77e444 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -1,3793 +1,3882 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "naming_series:", - "beta": 0, - "creation": "2013-05-21 16:16:39", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 0, + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "beta": 0, + "creation": "2013-05-21 16:16:39", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 0, "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "{supplier_name}", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Title", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "{supplier_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Title", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "naming_series", - "fieldtype": "Select", - "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": "Series", - "length": 0, - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "PINV-\nPINV-RET-", - "permlevel": 0, - "print_hide": 1, - "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": 1, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "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": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "PINV-\nPINV-RET-", + "permlevel": 0, + "print_hide": 1, + "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": 1, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier", - "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": 1, - "label": "Supplier", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier", - "oldfieldtype": "Link", - "options": "Supplier", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier", + "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": 1, + "label": "Supplier", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier", + "oldfieldtype": "Link", + "options": "Supplier", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "depends_on": "supplier", - "fieldname": "supplier_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Supplier Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier_name", - "oldfieldtype": "Data", - "options": "supplier.supplier_name", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "depends_on": "supplier", + "fieldname": "supplier_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Supplier Name", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier_name", + "oldfieldtype": "Data", + "options": "supplier.supplier_name", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "due_date", - "fieldtype": "Date", - "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": "Due Date", - "length": 0, - "no_copy": 0, - "oldfieldname": "due_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "due_date", + "fieldtype": "Date", + "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": "Due Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "due_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "is_paid", - "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": "Is Paid", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_paid", + "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": "Is Paid", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "column_break1", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "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, + "fieldname": "column_break1", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "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, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "company", - "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": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "company", + "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": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 1, + "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, - "default": "Today", - "fieldname": "posting_date", - "fieldtype": "Date", - "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": "Date", - "length": 0, - "no_copy": 0, - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Today", + "fieldname": "posting_date", + "fieldtype": "Date", + "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": "Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "posting_time", - "fieldtype": "Time", - "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": "Posting Time", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "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, + "fieldname": "posting_time", + "fieldtype": "Time", + "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": "Posting Time", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.docstatus==0", - "fieldname": "set_posting_time", - "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": "Edit Posting Date and Time", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.docstatus==0", + "fieldname": "set_posting_time", + "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": "Edit Posting Date and Time", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Link", - "options": "Purchase Invoice", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Link", + "options": "Purchase Invoice", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "collapsible_depends_on": "bill_no", - "columns": 0, - "fieldname": "supplier_invoice_details", - "fieldtype": "Section 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, - "label": "Supplier Invoice Details", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "bill_no", + "columns": 0, + "fieldname": "supplier_invoice_details", + "fieldtype": "Section 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, + "label": "Supplier Invoice Details", + "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": "", - "fieldname": "bill_no", - "fieldtype": "Data", - "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": "Supplier Invoice No", - "length": 0, - "no_copy": 0, - "oldfieldname": "bill_no", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "bill_no", + "fieldtype": "Data", + "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": "Supplier Invoice No", + "length": 0, + "no_copy": 0, + "oldfieldname": "bill_no", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "column_break_15", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_15", + "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, - "fieldname": "bill_date", - "fieldtype": "Date", - "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": "Supplier Invoice Date", - "length": 0, - "no_copy": 0, - "oldfieldname": "bill_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "bill_date", + "fieldtype": "Date", + "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": "Supplier Invoice Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "bill_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "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, - "depends_on": "is_return", - "fieldname": "returns", - "fieldtype": "Section 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, - "label": "Returns", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_return", + "fieldname": "returns", + "fieldtype": "Section 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, + "label": "Returns", + "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, - "default": "0", - "fieldname": "is_return", - "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": "Is Return", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "is_return", + "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": "Is Return", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "depends_on": "is_return", - "fieldname": "return_against", - "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": "Return Against Purchase Invoice", - "length": 0, - "no_copy": 1, - "options": "Purchase Invoice", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_return", + "fieldname": "return_against", + "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": "Return Against Purchase Invoice", + "length": 0, + "no_copy": 1, + "options": "Purchase Invoice", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "section_addresses", - "fieldtype": "Section 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, - "label": "Address and Contact", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "section_addresses", + "fieldtype": "Section 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, + "label": "Address and Contact", + "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, - "fieldname": "supplier_address", - "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": "Select Supplier Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_address", + "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": "Select Supplier Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "print_hide": 1, + "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, - "depends_on": "", - "fieldname": "address_display", - "fieldtype": "Small Text", - "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": "Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "address_display", + "fieldtype": "Small Text", + "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": "Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_person", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact Person", - "length": 0, - "no_copy": 0, - "options": "Contact", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_person", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact Person", + "length": 0, + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "contact_display", - "fieldtype": "Small Text", - "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": "Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_display", + "fieldtype": "Small Text", + "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": "Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_mobile", - "fieldtype": "Small Text", - "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": "Mobile No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_mobile", + "fieldtype": "Small Text", + "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": "Mobile No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_email", - "fieldtype": "Small Text", - "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": "Contact Email", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_email", + "fieldtype": "Small Text", + "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": "Contact Email", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "col_break_address", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break_address", + "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, - "depends_on": "", - "fieldname": "shipping_address", - "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": "Select Shipping Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "shipping_address", + "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": "Select Shipping Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "shipping_address_display", - "fieldtype": "Small Text", - "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": "Shipping Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_address_display", + "fieldtype": "Small Text", + "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": "Shipping Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "currency_and_price_list", - "fieldtype": "Section 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, - "label": "Currency and Price List", - "length": 0, - "no_copy": 0, - "options": "fa fa-tag", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "currency_and_price_list", + "fieldtype": "Section 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, + "label": "Currency and Price List", + "length": 0, + "no_copy": 0, + "options": "fa fa-tag", + "permlevel": 0, + "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, - "fieldname": "currency", - "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": "Currency", - "length": 0, - "no_copy": 0, - "oldfieldname": "currency", - "oldfieldtype": "Select", - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "currency", + "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": "Currency", + "length": 0, + "no_copy": 0, + "oldfieldname": "currency", + "oldfieldtype": "Select", + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "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": "", - "fieldname": "conversion_rate", - "fieldtype": "Float", - "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": "Exchange Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "conversion_rate", - "oldfieldtype": "Currency", - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "conversion_rate", + "fieldtype": "Float", + "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": "Exchange Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "conversion_rate", + "oldfieldtype": "Currency", + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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, - "fieldname": "column_break2", - "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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break2", + "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, + "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, - "fieldname": "buying_price_list", - "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": "Price List", - "length": 0, - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "buying_price_list", + "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": "Price List", + "length": 0, + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "price_list_currency", - "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": "Price List Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "price_list_currency", + "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": "Price List Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "plc_conversion_rate", - "fieldtype": "Float", - "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": "Price List Exchange Rate", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "plc_conversion_rate", + "fieldtype": "Float", + "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": "Price List Exchange Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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, - "fieldname": "ignore_pricing_rule", - "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": "Ignore Pricing Rule", - "length": 0, - "no_copy": 1, - "permlevel": 1, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "ignore_pricing_rule", + "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": "Ignore Pricing Rule", + "length": 0, + "no_copy": 1, + "permlevel": 1, + "print_hide": 1, + "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, - "fieldname": "items_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-shopping-cart", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "items_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-shopping-cart", + "permlevel": 0, + "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, - "default": "0", - "fieldname": "update_stock", - "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": "Update Stock", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "update_stock", + "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": "Update Stock", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "items", - "fieldtype": "Table", - "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": "Items", - "length": 0, - "no_copy": 0, - "oldfieldname": "entries", - "oldfieldtype": "Table", - "options": "Purchase Invoice Item", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "items", + "fieldtype": "Table", + "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": "Items", + "length": 0, + "no_copy": 0, + "oldfieldname": "entries", + "oldfieldtype": "Table", + "options": "Purchase Invoice Item", + "permlevel": 0, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_26", - "fieldtype": "Section 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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_26", + "fieldtype": "Section 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, + "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, - "fieldname": "base_total", - "fieldtype": "Currency", - "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": "Total (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_total", + "fieldtype": "Currency", + "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": "Total (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "", - "fieldname": "base_net_total", - "fieldtype": "Currency", - "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": "Net Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "net_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "base_net_total", + "fieldtype": "Currency", + "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": "Net Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "net_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_28", - "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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_28", + "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, + "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, - "fieldname": "total", - "fieldtype": "Currency", - "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": "Total", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total", + "fieldtype": "Currency", + "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": "Total", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "net_total", - "fieldtype": "Currency", - "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": "Net Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "net_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "net_total", + "fieldtype": "Currency", + "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": "Net Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "net_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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, - "fieldname": "taxes_and_charges", - "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": "Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_other_charges", - "oldfieldtype": "Link", - "options": "Purchase Taxes and Charges Template", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges", + "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": "Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_other_charges", + "oldfieldtype": "Link", + "options": "Purchase Taxes and Charges Template", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "taxes", - "fieldtype": "Table", - "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": "Purchase Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_tax_details", - "oldfieldtype": "Table", - "options": "Purchase Taxes and Charges", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_49", + "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": 1, - "columns": 0, - "fieldname": "sec_tax_breakup", - "fieldtype": "Section 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, - "label": "Tax Breakup", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_rule", + "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": "Shipping Rule", + "length": 0, + "no_copy": 0, + "options": "Shipping Rule", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "other_charges_calculation", - "fieldtype": "Text", - "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": "Taxes and Charges Calculation", - "length": 0, - "no_copy": 1, - "oldfieldtype": "HTML", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_51", + "fieldtype": "Section 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, - "fieldname": "totals", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes", + "fieldtype": "Table", + "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": "Purchase Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_tax_details", + "oldfieldtype": "Table", + "options": "Purchase Taxes and Charges", + "permlevel": 0, + "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, - "fieldname": "base_taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "sec_tax_breakup", + "fieldtype": "Section 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, + "label": "Tax Breakup", + "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, - "fieldname": "base_taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "other_charges_calculation", + "fieldtype": "Text", + "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": "Taxes and Charges Calculation", + "length": 0, + "no_copy": 1, + "oldfieldtype": "HTML", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "total_tax", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "totals", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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, - "fieldname": "column_break_40", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "total_tax", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_40", + "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": 1, - "collapsible_depends_on": "discount_amount", - "columns": 0, - "fieldname": "section_break_44", - "fieldtype": "Section 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, - "label": "Additional Discount", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "default": "Grand Total", - "fieldname": "apply_discount_on", - "fieldtype": "Select", - "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": "Apply Additional Discount On", - "length": 0, - "no_copy": 0, - "options": "\nGrand Total\nNet Total", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_46", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "discount_amount", + "columns": 0, + "fieldname": "section_break_44", + "fieldtype": "Section 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, + "label": "Additional Discount", + "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, - "fieldname": "additional_discount_percentage", - "fieldtype": "Float", - "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": "Additional Discount Percentage", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Grand Total", + "fieldname": "apply_discount_on", + "fieldtype": "Select", + "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": "Apply Additional Discount On", + "length": 0, + "no_copy": 0, + "options": "\nGrand Total\nNet Total", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "section_break_49", - "fieldtype": "Section 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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_46", + "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, - "fieldname": "base_grand_total", - "fieldtype": "Currency", - "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": "Grand Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "grand_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "additional_discount_percentage", + "fieldtype": "Float", + "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": "Additional Discount Percentage", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "base_rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment (Company Currency)", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "depends_on": "eval:!doc.disable_rounded_total", - "fieldname": "base_rounded_total", - "fieldtype": "Currency", - "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": "Rounded Total (Company Currency)", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_49", + "fieldtype": "Section 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": "", - "fieldname": "base_in_words", - "fieldtype": "Data", - "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": "In Words (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_grand_total", + "fieldtype": "Currency", + "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": "Grand Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "grand_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break8", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 1, - "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, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "depends_on": "eval:!doc.disable_rounded_total", + "fieldname": "base_rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "", + "fieldname": "base_in_words", + "fieldtype": "Data", + "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": "In Words (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break8", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 1, + "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, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "grand_total", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grand Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "grand_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "grand_total", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Grand Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "grand_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "depends_on": "eval:!doc.disable_rounded_total", - "fieldname": "rounded_total", - "fieldtype": "Currency", - "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": "Rounded Total", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.disable_rounded_total", + "fieldname": "rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "in_words", - "fieldtype": "Data", - "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": "In Words", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words_import", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "in_words", + "fieldtype": "Data", + "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": "In Words", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words_import", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "total_advance", - "fieldtype": "Currency", - "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": "Total Advance", - "length": 0, - "no_copy": 1, - "oldfieldname": "total_advance", - "oldfieldtype": "Currency", - "options": "party_account_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_advance", + "fieldtype": "Currency", + "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": "Total Advance", + "length": 0, + "no_copy": 1, + "oldfieldname": "total_advance", + "oldfieldtype": "Currency", + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "outstanding_amount", - "fieldtype": "Currency", - "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": "Outstanding Amount", - "length": 0, - "no_copy": 1, - "oldfieldname": "outstanding_amount", - "oldfieldtype": "Currency", - "options": "party_account_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "outstanding_amount", + "fieldtype": "Currency", + "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": "Outstanding Amount", + "length": 0, + "no_copy": 1, + "oldfieldname": "outstanding_amount", + "oldfieldtype": "Currency", + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "depends_on": "grand_total", - "fieldname": "disable_rounded_total", - "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": "Disable Rounded Total", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "grand_total", + "fieldname": "disable_rounded_total", + "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": "Disable Rounded Total", + "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": 1, - "collapsible_depends_on": "paid_amount", - "columns": 0, - "depends_on": "eval:doc.is_paid===1||(doc.advances && doc.advances.length>0)", - "fieldname": "payments_section", - "fieldtype": "Section 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, - "label": "Payments", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "paid_amount", + "columns": 0, + "depends_on": "eval:doc.is_paid===1||(doc.advances && doc.advances.length>0)", + "fieldname": "payments_section", + "fieldtype": "Section 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, + "label": "Payments", + "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, - "fieldname": "mode_of_payment", - "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": "Mode of Payment", - "length": 0, - "no_copy": 0, - "options": "Mode of Payment", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "mode_of_payment", + "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": "Mode of Payment", + "length": 0, + "no_copy": 0, + "options": "Mode of Payment", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "cash_bank_account", - "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": "Cash/Bank Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cash_bank_account", + "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": "Cash/Bank Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "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, - "fieldname": "col_br_payments", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_br_payments", + "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, - "depends_on": "is_paid", - "fieldname": "paid_amount", - "fieldtype": "Currency", - "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": "Paid Amount", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_paid", + "fieldname": "paid_amount", + "fieldtype": "Currency", + "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": "Paid Amount", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "base_paid_amount", - "fieldtype": "Currency", - "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": "Paid Amount (Company Currency)", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_paid_amount", + "fieldtype": "Currency", + "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": "Paid Amount (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "collapsible_depends_on": "write_off_amount", - "columns": 0, - "depends_on": "grand_total", - "fieldname": "write_off", - "fieldtype": "Section 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, - "label": "Write Off", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "write_off_amount", + "columns": 0, + "depends_on": "grand_total", + "fieldname": "write_off", + "fieldtype": "Section 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, + "label": "Write Off", + "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, - "fieldname": "write_off_amount", - "fieldtype": "Currency", - "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": "Write Off Amount", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "write_off_amount", + "fieldtype": "Currency", + "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": "Write Off Amount", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "base_write_off_amount", - "fieldtype": "Currency", - "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": "Write Off Amount (Company Currency)", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_write_off_amount", + "fieldtype": "Currency", + "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": "Write Off Amount (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_61", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_61", + "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, - "depends_on": "eval:flt(doc.write_off_amount)!=0", - "fieldname": "write_off_account", - "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": "Write Off Account", - "length": 0, - "no_copy": 0, - "options": "Account", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:flt(doc.write_off_amount)!=0", + "fieldname": "write_off_account", + "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": "Write Off Account", + "length": 0, + "no_copy": 0, + "options": "Account", + "permlevel": 0, + "print_hide": 1, + "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, - "depends_on": "eval:flt(doc.write_off_amount)!=0", - "fieldname": "write_off_cost_center", - "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": "Write Off Cost Center", - "length": 0, - "no_copy": 0, - "options": "Cost Center", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:flt(doc.write_off_amount)!=0", + "fieldname": "write_off_cost_center", + "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": "Write Off Cost Center", + "length": 0, + "no_copy": 0, + "options": "Cost Center", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "collapsible_depends_on": "advances", - "columns": 0, - "fieldname": "advances_section", - "fieldtype": "Section 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, - "label": "Advance Payments", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "advances", + "columns": 0, + "fieldname": "advances_section", + "fieldtype": "Section 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, + "label": "Advance Payments", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "get_advances", - "fieldtype": "Button", - "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": "Get Advances Paid", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Button", - "options": "", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "get_advances", + "fieldtype": "Button", + "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": "Get Advances Paid", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Button", + "options": "", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "advances", - "fieldtype": "Table", - "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": "Advances", - "length": 0, - "no_copy": 1, - "oldfieldname": "advance_allocation_details", - "oldfieldtype": "Table", - "options": "Purchase Invoice Advance", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "advances", + "fieldtype": "Table", + "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": "Advances", + "length": 0, + "no_copy": 1, + "oldfieldname": "advance_allocation_details", + "oldfieldtype": "Table", + "options": "Purchase Invoice Advance", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "collapsible_depends_on": "terms", - "columns": 0, - "fieldname": "terms_section_break", - "fieldtype": "Section 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, - "label": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "options": "fa fa-legal", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "terms", + "columns": 0, + "fieldname": "terms_section_break", + "fieldtype": "Section 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, + "label": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "options": "fa fa-legal", + "permlevel": 0, + "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, - "fieldname": "tc_name", - "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": "Terms", - "length": 0, - "no_copy": 0, - "options": "Terms and Conditions", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tc_name", + "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": "Terms", + "length": 0, + "no_copy": 0, + "options": "Terms and Conditions", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "terms", - "fieldtype": "Text Editor", - "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": "Terms and Conditions1", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "terms", + "fieldtype": "Text Editor", + "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": "Terms and Conditions1", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "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, - "fieldname": "raw_materials_supplied", - "fieldtype": "Section 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, - "label": "Raw Materials Supplied", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "raw_materials_supplied", + "fieldtype": "Section 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, + "label": "Raw Materials Supplied", + "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, - "default": "No", - "fieldname": "is_subcontracted", - "fieldtype": "Select", - "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": "Raw Materials Supplied", - "length": 0, - "no_copy": 0, - "options": "No\nYes", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "No", + "fieldname": "is_subcontracted", + "fieldtype": "Select", + "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": "Raw Materials Supplied", + "length": 0, + "no_copy": 0, + "options": "No\nYes", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "supplier_warehouse", - "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": "Supplier Warehouse", - "length": 0, - "no_copy": 1, - "options": "Warehouse", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "50px", - "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, + "fieldname": "supplier_warehouse", + "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": "Supplier Warehouse", + "length": 0, + "no_copy": 1, + "options": "Warehouse", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "supplied_items", - "fieldtype": "Table", - "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": "Supplied Items", - "length": 0, - "no_copy": 0, - "options": "Purchase Receipt Item Supplied", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplied_items", + "fieldtype": "Table", + "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": "Supplied Items", + "length": 0, + "no_copy": 0, + "options": "Purchase Receipt Item Supplied", + "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": 1, - "columns": 0, - "fieldname": "printing_settings", - "fieldtype": "Section 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, - "label": "Printing Settings", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "printing_settings", + "fieldtype": "Section 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, + "label": "Printing Settings", + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "letter_head", - "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": "Letter Head", - "length": 0, - "no_copy": 0, - "options": "Letter Head", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "letter_head", + "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": "Letter Head", + "length": 0, + "no_copy": 0, + "options": "Letter Head", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "select_print_heading", - "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": "Print Heading", - "length": 0, - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "select_print_heading", + "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": "Print Heading", + "length": 0, + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "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, - "fieldname": "language", - "fieldtype": "Data", - "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": "Print Language", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "language", + "fieldtype": "Data", + "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": "Print Language", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "more_info", - "fieldtype": "Section 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, - "label": "More Information", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-file-text", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "more_info", + "fieldtype": "Section 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, + "label": "More Information", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-file-text", + "permlevel": 0, + "print_hide": 1, + "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": "", - "fieldname": "credit_to", - "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": "Credit To", - "length": 0, - "no_copy": 0, - "oldfieldname": "credit_to", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "credit_to", + "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": "Credit To", + "length": 0, + "no_copy": 0, + "oldfieldname": "credit_to", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "party_account_currency", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Party Account Currency", - "length": 0, - "no_copy": 1, - "options": "Currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Party Account Currency", + "length": 0, + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "default": "No", - "description": "", - "fieldname": "is_opening", - "fieldtype": "Select", - "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": "Is Opening", - "length": 0, - "no_copy": 0, - "oldfieldname": "is_opening", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "No", + "description": "", + "fieldname": "is_opening", + "fieldtype": "Select", + "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": "Is Opening", + "length": 0, + "no_copy": 0, + "oldfieldname": "is_opening", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "against_expense_account", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Against Expense Account", - "length": 0, - "no_copy": 1, - "oldfieldname": "against_expense_account", - "oldfieldtype": "Small Text", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "against_expense_account", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Against Expense Account", + "length": 0, + "no_copy": 1, + "oldfieldname": "against_expense_account", + "oldfieldtype": "Small Text", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "column_break_63", - "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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_63", + "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, + "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, - "default": "Draft", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "\nDraft\nReturn\nDebit Note Issued\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Draft", + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "\nDraft\nReturn\nDebit Note Issued\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled", + "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, - "fieldname": "remarks", - "fieldtype": "Small Text", - "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": "Remarks", - "length": 0, - "no_copy": 1, - "oldfieldname": "remarks", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "remarks", + "fieldtype": "Small Text", + "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": "Remarks", + "length": 0, + "no_copy": 1, + "oldfieldname": "remarks", + "oldfieldtype": "Text", + "permlevel": 0, + "print_hide": 1, + "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": "Warehouse where you are maintaining stock of rejected items", - "fieldname": "rejected_warehouse", - "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": "Rejected Warehouse", - "length": 0, - "no_copy": 1, - "options": "Warehouse", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Warehouse where you are maintaining stock of rejected items", + "fieldname": "rejected_warehouse", + "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": "Rejected Warehouse", + "length": 0, + "no_copy": 1, + "options": "Warehouse", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "Start date of current invoice's period", - "fieldname": "from_date", - "fieldtype": "Date", - "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": "From Date", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "description": "Start date of current invoice's period", + "fieldname": "from_date", + "fieldtype": "Date", + "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": "From Date", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "End date of current invoice's period", - "fieldname": "to_date", - "fieldtype": "Date", - "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": "To Date", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "description": "End date of current invoice's period", + "fieldname": "to_date", + "fieldtype": "Date", + "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": "To Date", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "column_break_114", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_114", + "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-file-text", - "idx": 204, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2017-11-16 01:04:15.308603", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Purchase Invoice", - "name_case": "Title Case", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-file-text", + "idx": 204, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "menu_index": 0, + "modified": "2017-11-16 01:04:15.308603", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Purchase Invoice", + "name_case": "Title Case", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Auditor", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Auditor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 1, - "print": 0, - "read": 1, - "report": 0, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 1, - "search_fields": "posting_date, supplier, bill_no, base_grand_total, outstanding_amount", - "show_name_in_global_search": 1, - "sort_field": "modified", - "sort_order": "DESC", - "timeline_field": "supplier", - "title_field": "title", - "track_changes": 1, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 1, + "search_fields": "posting_date, supplier, bill_no, base_grand_total, outstanding_amount", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC", + "timeline_field": "supplier", + "title_field": "title", + "track_changes": 1, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index baf016d5964..68bd3c2bc3f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -555,6 +555,40 @@ class TestPurchaseInvoice(unittest.TestCase): #check outstanding after advance cancellation self.assertEqual(flt(pi.outstanding_amount), flt(pi.rounded_total + pi.total_advance)) + def test_purchase_invoice_with_shipping_rule(self): + from erpnext.accounts.doctype.shipping_rule.test_shipping_rule \ + import create_shipping_rule + + shipping_rule = create_shipping_rule(shipping_rule_type = "Buying", shipping_rule_name = "Shipping Rule - Purchase Invoice Test") + + pi = frappe.copy_doc(test_records[0]) + + pi.shipping_rule = shipping_rule.name + pi.insert() + + shipping_amount = 0.0 + for condition in shipping_rule.get("conditions"): + if not condition.to_value or (flt(condition.from_value) <= pi.net_total <= flt(condition.to_value)): + shipping_amount = condition.shipping_amount + + shipping_charge = { + "doctype": "Purchase Taxes and Charges", + "category": "Valuation and Total", + "charge_type": "Actual", + "account_head": shipping_rule.account, + "cost_center": shipping_rule.cost_center, + "tax_amount": shipping_amount, + "description": shipping_rule.name, + "add_deduct_tax": "Add" + } + pi.append("taxes", shipping_charge) + pi.save() + + self.assertEquals(pi.net_total, 1250) + + self.assertEquals(pi.total_taxes_and_charges, 462.3) + self.assertEquals(pi.grand_total, 1712.3) + def unlink_payment_on_cancel_of_invoice(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") accounts_settings.unlink_payment_on_cancellation_of_invoice = enable diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 12b556b5b4c..460158b3ed8 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -1371,6 +1371,39 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(expected_values[gle.account][1], gle.debit) self.assertEquals(expected_values[gle.account][2], gle.credit) + def test_sales_invoice_with_shipping_rule(self): + from erpnext.accounts.doctype.shipping_rule.test_shipping_rule \ + import create_shipping_rule + + shipping_rule = create_shipping_rule(shipping_rule_type = "Selling", shipping_rule_name = "Shipping Rule - Sales Invoice Test") + + si = frappe.copy_doc(test_records[2]) + + si.shipping_rule = shipping_rule.name + si.insert() + + shipping_amount = 0.0 + for condition in shipping_rule.get("conditions"): + if not condition.to_value or (flt(condition.from_value) <= si.net_total <= flt(condition.to_value)): + shipping_amount = condition.shipping_amount + + shipping_charge = { + "doctype": "Sales Taxes and Charges", + "category": "Valuation and Total", + "charge_type": "Actual", + "account_head": shipping_rule.account, + "cost_center": shipping_rule.cost_center, + "tax_amount": shipping_amount, + "description": shipping_rule.name + } + si.append("taxes", shipping_charge) + si.save() + + self.assertEquals(si.net_total, 1250) + + self.assertEquals(si.total_taxes_and_charges, 577.05) + self.assertEquals(si.grand_total, 1827.05) + def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") args = frappe._dict(args) diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.js b/erpnext/accounts/doctype/shipping_rule/shipping_rule.js index 17f20839839..53ee08a773e 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.js +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.js @@ -1,3 +1,15 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt +frappe.ui.form.on('Shipping Rule', { + refresh: function(frm) { + frm.trigger('toggle_reqd'); + }, + calculate_based_on: function(frm) { + frm.trigger('toggle_reqd'); + }, + toggle_reqd: function(frm) { + frm.toggle_reqd("shipping_amount", frm.doc.calculate_based_on === 'Fixed'); + frm.toggle_reqd("conditions", frm.doc.calculate_based_on !== 'Fixed'); + } +}); \ No newline at end of file diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.json b/erpnext/accounts/doctype/shipping_rule/shipping_rule.json index a8788a185ff..13b3265a94b 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.json +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "field:label", @@ -12,6 +13,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -23,7 +25,8 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, - "in_list_view": 1, + "in_global_search": 0, + "in_list_view": 0, "in_standard_filter": 0, "label": "Shipping Rule Label", "length": 0, @@ -40,6 +43,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -50,6 +54,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Disabled", @@ -68,134 +73,53 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "default": "Net Total", - "fieldname": "calculate_based_on", + "fieldname": "column_break_4", + "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, + "fieldname": "shipping_rule_type", "fieldtype": "Select", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Calculate Based On", - "length": 0, - "no_copy": 0, - "options": "Net Total\nNet Weight", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "depends_on": "eval:!doc.disabled", - "fieldname": "rule_conditions_section", - "fieldtype": "Section 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, - "label": "Shipping Rule Conditions", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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": "conditions", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Shipping Rule Conditions", - "length": 0, - "no_copy": 0, - "options": "Shipping Rule Condition", - "permlevel": 0, - "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, - "depends_on": "eval:!doc.disabled", - "fieldname": "section_break_6", - "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": "Valid for Countries", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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": "worldwide_shipping", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Worldwide Shipping", + "label": "Shipping Rule Type", "length": 0, "no_copy": 0, + "options": "Selling\nBuying", "permlevel": 0, "precision": "", "print_hide": 0, @@ -209,36 +133,7 @@ "unique": 0 }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.worldwide_shipping", - "fieldname": "countries", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Valid for Countries", - "length": 0, - "no_copy": 0, - "options": "Shipping Rule Country", - "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, @@ -250,8 +145,10 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, + "label": "Accounting", "length": 0, "no_copy": 0, "permlevel": 0, @@ -266,6 +163,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -276,6 +174,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Company", @@ -294,6 +193,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -304,6 +204,7 @@ "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, @@ -320,6 +221,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -330,6 +232,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Shipping Account", @@ -348,6 +251,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -358,6 +262,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Cost Center", @@ -374,20 +279,264 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_amount_section", + "fieldtype": "Section 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, + "label": "", + "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, + "default": "Fixed", + "fieldname": "calculate_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Calculate Based On", + "length": 0, + "no_copy": 0, + "options": "Fixed\nNet Total", + "permlevel": 0, + "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, + "fieldname": "column_break_8", + "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, + "depends_on": "eval:doc.calculate_based_on==='Fixed'", + "fieldname": "shipping_amount", + "fieldtype": "Currency", + "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": "Shipping Amount", + "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, + "collapsible_depends_on": "", + "columns": 0, + "depends_on": "eval:doc.calculate_based_on!=='Fixed'", + "fieldname": "rule_conditions_section", + "fieldtype": "Section 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, + "label": "Shipping Rule Conditions", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "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, + "fieldname": "conditions", + "fieldtype": "Table", + "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": "Shipping Rule Conditions", + "length": 0, + "no_copy": 0, + "options": "Shipping Rule Condition", + "permlevel": 0, + "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, + "depends_on": "", + "fieldname": "section_break_6", + "fieldtype": "Section 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, + "label": "Restrict to Countries", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "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, + "depends_on": "", + "fieldname": "countries", + "fieldtype": "Table", + "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": "Valid for Countries", + "length": 0, + "no_copy": 0, + "options": "Shipping Rule Country", + "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 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-truck", "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-07 05:18:06.472734", + "modified": "2017-11-17 13:10:34.302259", "modified_by": "Administrator", "module": "Accounts", "name": "Shipping Rule", @@ -403,7 +552,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -424,7 +572,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -445,7 +592,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -466,7 +612,6 @@ "export": 0, "if_owner": 0, "import": 0, - "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -481,6 +626,8 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, "sort_order": "ASC", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py index a47df2d8625..259b1a8b664 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py @@ -15,18 +15,10 @@ class ManyBlankToValuesError(frappe.ValidationError): pass class ShippingRule(Document): def validate(self): - self.validate_value("calculate_based_on", "in", ["Net Total", "Net Weight"]) - self.conditions = self.get("conditions") self.validate_from_to_values() self.sort_shipping_rule_conditions() self.validate_overlapping_shipping_rule_conditions() - if self.worldwide_shipping: - self.countries = [] - - elif not len([d.country for d in self.countries if d.country]): - frappe.throw(_("Please specify a country for this Shipping Rule or check Worldwide Shipping")) - def validate_from_to_values(self): zero_to_values = [] @@ -47,6 +39,76 @@ class ShippingRule(Document): throw(_('There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'), ManyBlankToValuesError) + def apply(self, doc): + '''Apply shipping rule on given doc. Called from accounts controller''' + + shipping_amount = 0.0 + by_value = False + + self.validate_countries(doc) + + if self.calculate_based_on == 'Net Total': + value = doc.base_net_total + by_value = True + + elif self.calculate_based_on == 'Fixed': + shipping_amount = self.shipping_amount + + # shipping amount by value, apply conditions + if by_value: + shipping_amount = self.get_shipping_amount_from_rules(value) + + # convert to order currency + if doc.currency != doc.company_currency: + shipping_amount = flt(shipping_amount / doc.conversion_rate, 2) + + self.add_shipping_rule_to_tax_table(doc, shipping_amount) + + def get_shipping_amount_from_rules(self, value): + for condition in self.get("conditions"): + if not condition.to_value or (flt(condition.from_value) <= value <= flt(condition.to_value)): + return condition.shipping_amount + + return 0.0 + + def validate_countries(self, doc): + # validate applicable countries + if self.countries: + shipping_country = doc.get_shipping_address().get('country') + if not shipping_country: + frappe.throw(_('Shipping Address does not have country, which is required for this Shipping Rule')) + if shipping_country not in [d.country for d in self.countries]: + frappe.throw(_('Shipping rule not applicable for country {0}'.format(shipping_country))) + + def add_shipping_rule_to_tax_table(self, doc, shipping_amount): + shipping_charge = { + "charge_type": "Actual", + "account_head": self.account, + "cost_center": self.cost_center + } + if self.shipping_rule_type == "Selling": + # check if not applied on purchase + if not doc.meta.get_field('taxes').options == 'Sales Taxes and Charges': + frappe.throw(_('Shipping rule only applicable for Selling')) + shipping_charge["doctype"] = "Sales Taxes and Charges" + else: + # check if not applied on sales + if not doc.meta.get_field('taxes').options == 'Purchase Taxes and Charges': + frappe.throw(_('Shipping rule only applicable for Buying')) + + shipping_charge["doctype"] = "Purchase Taxes and Charges" + shipping_charge["category"] = "Valuation and Total" + shipping_charge["add_deduct_tax"] = "Add" + + existing_shipping_charge = doc.get("taxes", filters=shipping_charge) + if existing_shipping_charge: + # take the last record found + existing_shipping_charge[-1].tax_amount = shipping_amount + else: + shipping_charge["tax_amount"] = shipping_amount + shipping_charge["description"] = self.label + doc.append("taxes", shipping_charge) + def sort_shipping_rule_conditions(self): """Sort Shipping Rule Conditions based on increasing From Value""" self.shipping_rules_conditions = sorted(self.conditions, key=lambda d: flt(d.from_value)) diff --git a/erpnext/accounts/doctype/shipping_rule/test_records.json b/erpnext/accounts/doctype/shipping_rule/test_records.json index a271009b2b4..26b37374433 100644 --- a/erpnext/accounts/doctype/shipping_rule/test_records.json +++ b/erpnext/accounts/doctype/shipping_rule/test_records.json @@ -7,6 +7,7 @@ "doctype": "Shipping Rule", "label": "_Test Shipping Rule", "name": "_Test Shipping Rule", + "shipping_rule_type": "Selling", "conditions": [ { "doctype": "Shipping Rule Condition", @@ -26,9 +27,12 @@ "doctype": "Shipping Rule Condition", "from_value": 201, "parentfield": "conditions", - "shipping_amount": 0.0 + "shipping_amount": 200.0 } ], + "countries": [ + {"country": "India"} + ], "worldwide_shipping": 1 }, { @@ -73,6 +77,7 @@ "doctype": "Shipping Rule", "label": "_Test Shipping Rule - Rest of the World", "name": "_Test Shipping Rule - Rest of the World", + "shipping_rule_type": "Buying", "conditions": [ { "doctype": "Shipping Rule Condition", @@ -95,6 +100,9 @@ "shipping_amount": 1500.0 } ], - "worldwide_shipping": 1 + "worldwide_shipping": 1, + "countries": [ + {"country": "Germany"} + ] } ] diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js index 9c72aebf609..0201f762b37 100644 --- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js +++ b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js @@ -7,6 +7,8 @@ QUnit.test("test Shipping Rule", function(assert) { () => { return frappe.tests.make("Shipping Rule", [ {label: "Next Day Shipping"}, + {shipping_rule_type: "Selling"}, + {calculate_based_on: 'Net Total'}, {conditions:[ [ {from_value:1}, diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py index 76b1d9e389c..582ecb2e165 100644 --- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py @@ -36,3 +36,38 @@ class TestShippingRule(unittest.TestCase): shipping_rule.get("conditions")[1].from_value = range_b[0] shipping_rule.get("conditions")[1].to_value = range_b[1] self.assertRaises(OverlappingConditionError, shipping_rule.insert) + +def create_shipping_rule(shipping_rule_type, shipping_rule_name): + sr = frappe.new_doc("Shipping Rule") + sr.account = "_Test Account Shipping Charges - _TC" + sr.calculate_based_on = "Net Total" + sr.company = "_Test Company" + sr.cost_center = "_Test Cost Center - _TC" + sr.label = shipping_rule_name + sr.name = shipping_rule_name + sr.shipping_rule_type = shipping_rule_type + + sr.append("conditions", { + "doctype": "Shipping Rule Condition", + "from_value": 0, + "parentfield": "conditions", + "shipping_amount": 50.0, + "to_value": 100 + }) + sr.append("conditions", { + "doctype": "Shipping Rule Condition", + "from_value": 101, + "parentfield": "conditions", + "shipping_amount": 100.0, + "to_value": 200 + }) + sr.append("conditions", { + "doctype": "Shipping Rule Condition", + "from_value": 201, + "parentfield": "conditions", + "shipping_amount": 200.0, + "to_value": 2000 + }) + sr.insert(ignore_permissions=True) + sr.submit() + return sr diff --git a/erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js b/erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js new file mode 100644 index 00000000000..ab1b77cd5f5 --- /dev/null +++ b/erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js @@ -0,0 +1,37 @@ +QUnit.module('Shipping Rule'); + +QUnit.test("test Shipping Rule", function(assert) { + assert.expect(1); + let done = assert.async(); + frappe.run_serially([ + () => { + return frappe.tests.make("Shipping Rule", [ + {label: "Two Day Shipping"}, + {shipping_rule_type: "Buying"}, + {fixed_shipping_amount: 0}, + {conditions:[ + [ + {from_value:1}, + {to_value:200}, + {shipping_amount:100} + ], + [ + {from_value:201}, + {to_value:3000}, + {shipping_amount:200} + ], + ]}, + {countries:[ + [ + {country:'India'} + ] + ]}, + {account:'Accounts Payable - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}, + {cost_center:'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} + ]); + }, + () => {assert.ok(cur_frm.doc.name=='Two Day Shipping');}, + () => done() + ]); +}); + diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index e18f96f5adb..0b62b71a715 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -1,3184 +1,3273 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "naming_series:", - "beta": 0, - "creation": "2013-05-21 16:16:39", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 0, + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "beta": 0, + "creation": "2013-05-21 16:16:39", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 0, "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "options": "fa fa-user", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "options": "fa fa-user", + "permlevel": 0, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "{supplier_name}", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Title", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "{supplier_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Title", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "naming_series", - "fieldtype": "Select", - "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": "Series", - "length": 0, - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "PO-", - "permlevel": 0, - "print_hide": 1, - "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": 1, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "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": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "PO-", + "permlevel": 0, + "print_hide": 1, + "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": 1, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "supplier", - "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": 1, - "label": "Supplier", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier", - "oldfieldtype": "Link", - "options": "Supplier", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "supplier", + "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": 1, + "label": "Supplier", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier", + "oldfieldtype": "Link", + "options": "Supplier", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.supplier && doc.docstatus===0 && (!(doc.items && doc.items.length) || (doc.items.length==1 && !doc.items[0].item_code))", - "fieldname": "get_items_from_open_material_requests", - "fieldtype": "Button", - "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": "Get Items from Open Material Requests", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.supplier && doc.docstatus===0 && (!(doc.items && doc.items.length) || (doc.items.length==1 && !doc.items[0].item_code))", + "fieldname": "get_items_from_open_material_requests", + "fieldtype": "Button", + "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": "Get Items from Open Material Requests", + "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, - "default": "No", - "fieldname": "is_subcontracted", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Supply Raw Materials", - "length": 0, - "no_copy": 0, - "options": "No\nYes", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "No", + "fieldname": "is_subcontracted", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Supply Raw Materials", + "length": 0, + "no_copy": 0, + "options": "No\nYes", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Supplier Name", - "length": 0, - "no_copy": 0, - "options": "supplier.supplier_name", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Supplier Name", + "length": 0, + "no_copy": 0, + "options": "supplier.supplier_name", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break1", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break1", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Today", - "fieldname": "transaction_date", - "fieldtype": "Date", - "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": "Date", - "length": 0, - "no_copy": 0, - "oldfieldname": "transaction_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "fieldname": "schedule_date", - "fieldtype": "Date", - "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": "Reqd By Date", - "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, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Data", - "options": "Purchase Order", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": "", - "fieldname": "company", - "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": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": "", - "columns": 0, - "fieldname": "drop_ship", - "fieldtype": "Section 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, - "label": "Drop Ship", - "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, - "depends_on": "", - "fieldname": "customer", - "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": "Customer", - "length": 0, - "no_copy": 0, - "options": "Customer", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": 1, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "customer_name", - "fieldtype": "Data", - "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": "Customer Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "column_break_19", - "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, - "depends_on": "", - "fieldname": "customer_contact_person", - "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": "Customer Contact", - "length": 0, - "no_copy": 0, - "options": "Contact", - "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, - "fieldname": "customer_contact_display", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, - "fieldname": "customer_contact_mobile", - "fieldtype": "Small Text", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer Mobile No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, - "fieldname": "customer_contact_email", - "fieldtype": "Code", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Customer Contact Email", - "length": 0, - "no_copy": 0, - "options": "Email", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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": 1, - "columns": 0, - "fieldname": "section_addresses", - "fieldtype": "Section 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, - "label": "Address and Contact", - "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, - "fieldname": "supplier_address", - "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": "Select Supplier Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "print_hide": 1, - "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, - "fieldname": "contact_person", - "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": "Contact Person", - "length": 0, - "no_copy": 0, - "options": "Contact", - "permlevel": 0, - "print_hide": 1, - "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, - "depends_on": "", - "fieldname": "address_display", - "fieldtype": "Small Text", - "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": "Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "contact_display", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "contact_mobile", - "fieldtype": "Small Text", - "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": "Mobile No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "contact_email", - "fieldtype": "Small Text", - "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": "Contact Email", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "col_break_address", - "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, - "depends_on": "", - "fieldname": "shipping_address", - "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": "Select Shipping Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, - "fieldname": "shipping_address_display", - "fieldtype": "Small Text", - "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": "Shipping Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": 1, - "columns": 0, - "fieldname": "currency_and_price_list", - "fieldtype": "Section 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, - "label": "Currency and Price List", - "length": 0, - "no_copy": 0, - "options": "fa fa-tag", - "permlevel": 0, - "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, - "fieldname": "currency", - "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": "Currency", - "length": 0, - "no_copy": 0, - "oldfieldname": "currency", - "oldfieldtype": "Select", - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "conversion_rate", - "fieldtype": "Float", - "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": "Exchange Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "conversion_rate", - "oldfieldtype": "Currency", - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cb_price_list", - "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, - "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, - "fieldname": "buying_price_list", - "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": "Price List", - "length": 0, - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 1, - "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, - "fieldname": "price_list_currency", - "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": "Price List Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "plc_conversion_rate", - "fieldtype": "Float", - "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": "Price List Exchange Rate", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, - "fieldname": "ignore_pricing_rule", - "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": "Ignore Pricing Rule", - "length": 0, - "no_copy": 1, - "permlevel": 1, - "print_hide": 1, - "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, - "fieldname": "items_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-shopping-cart", - "permlevel": 0, - "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, - "fieldname": "items", - "fieldtype": "Table", - "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": "Items", - "length": 0, - "no_copy": 0, - "oldfieldname": "po_details", - "oldfieldtype": "Table", - "options": "Purchase Order Item", - "permlevel": 0, - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)", - "fieldname": "link_to_mrs", - "fieldtype": "Button", - "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": "Link to material requests", - "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, - "fieldname": "sb_last_purchase", - "fieldtype": "Section 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, - "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, - "fieldname": "base_total", - "fieldtype": "Currency", - "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": "Total (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "base_net_total", - "fieldtype": "Currency", - "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": "Net Total (Company Currency)", - "length": 0, - "no_copy": 1, - "oldfieldname": "net_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "column_break_26", - "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, - "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, - "fieldname": "total", - "fieldtype": "Currency", - "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": "Total", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "net_total", - "fieldtype": "Currency", - "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": "Net Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "net_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "taxes_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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": "", - "fieldname": "taxes_and_charges", - "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": "Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_other_charges", - "oldfieldtype": "Link", - "options": "Purchase Taxes and Charges Template", - "permlevel": 0, - "print_hide": 1, - "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, - "fieldname": "taxes", - "fieldtype": "Table", - "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": "Purchase Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_tax_details", - "oldfieldtype": "Table", - "options": "Purchase Taxes and Charges", - "permlevel": 0, - "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": 1, - "columns": 0, - "fieldname": "sec_tax_breakup", - "fieldtype": "Section 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, - "label": "Tax Breakup", - "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, - "fieldname": "other_charges_calculation", - "fieldtype": "Text", - "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": "Taxes and Charges Calculation", - "length": 0, - "no_copy": 1, - "oldfieldtype": "HTML", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "totals", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, - "fieldname": "base_taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "base_taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "base_total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges (Company Currency)", - "length": 0, - "no_copy": 1, - "oldfieldname": "total_tax", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "column_break_39", - "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, - "fieldname": "taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": 1, - "collapsible_depends_on": "discount_amount", - "columns": 0, - "fieldname": "discount_section", - "fieldtype": "Section 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, - "label": "Additional Discount", - "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, - "default": "Grand Total", - "fieldname": "apply_discount_on", - "fieldtype": "Select", - "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": "Apply Additional Discount On", - "length": 0, - "no_copy": 0, - "options": "\nGrand Total\nNet Total", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, - "fieldname": "base_discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "column_break_45", - "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, - "fieldname": "additional_discount_percentage", - "fieldtype": "Float", - "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": "Additional Discount Percentage", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, - "fieldname": "discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, - "fieldname": "totals_section", - "fieldtype": "Section 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, - "fieldname": "base_grand_total", - "fieldtype": "Currency", - "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": "Grand Total (Company Currency)", - "length": 0, - "no_copy": 1, - "oldfieldname": "grand_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "base_rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment (Company Currency)", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": "In Words will be visible once you save the Purchase Order.", - "fieldname": "base_in_words", - "fieldtype": "Data", - "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": "In Words (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "base_rounded_total", - "fieldtype": "Currency", - "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": "Rounded Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "rounded_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "column_break4", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "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, - "fieldname": "grand_total", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grand Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "grand_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "in_words", - "fieldtype": "Data", - "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": "In Words", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words_import", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "advance_paid", - "fieldtype": "Currency", - "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": "Advance Paid", - "length": 0, - "no_copy": 1, - "options": "party_account_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": 1, - "collapsible_depends_on": "terms", - "columns": 0, - "fieldname": "terms_section_break", - "fieldtype": "Section 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, - "label": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-legal", - "permlevel": 0, - "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, - "fieldname": "tc_name", - "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": "Terms", - "length": 0, - "no_copy": 0, - "oldfieldname": "tc_name", - "oldfieldtype": "Link", - "options": "Terms and Conditions", - "permlevel": 0, - "print_hide": 1, - "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, - "fieldname": "terms", - "fieldtype": "Text Editor", - "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": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "oldfieldname": "terms", - "oldfieldtype": "Text Editor", - "permlevel": 0, - "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": 1, - "columns": 0, - "fieldname": "more_info", - "fieldtype": "Section 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, - "label": "More Information", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "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, - "default": "Draft", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Status", - "length": 0, - "no_copy": 1, - "oldfieldname": "status", - "oldfieldtype": "Select", - "options": "\nDraft\nTo Receive and Bill\nTo Bill\nTo Receive\nCompleted\nCancelled\nClosed\nDelivered", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "ref_sq", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Ref SQ", - "length": 0, - "no_copy": 1, - "oldfieldname": "ref_sq", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "party_account_currency", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Party Account Currency", - "length": 0, - "no_copy": 1, - "options": "Currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "fieldname": "column_break_74", - "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, - "depends_on": "eval:!doc.__islocal", - "description": "", - "fieldname": "per_received", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "% Received", - "length": 0, - "no_copy": 1, - "oldfieldname": "per_received", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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, - "depends_on": "eval:!doc.__islocal", - "description": "", - "fieldname": "per_billed", - "fieldtype": "Percent", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "% Billed", - "length": 0, - "no_copy": 1, - "oldfieldname": "per_billed", - "oldfieldtype": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "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": 1, - "columns": 0, - "fieldname": "column_break5", - "fieldtype": "Section 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, - "label": "Printing Settings", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "default": "Today", + "fieldname": "transaction_date", + "fieldtype": "Date", + "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": "Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "transaction_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "", + "fieldname": "schedule_date", + "fieldtype": "Date", + "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": "Reqd By Date", + "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, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Data", + "options": "Purchase Order", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "", + "fieldname": "company", + "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": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": "", + "columns": 0, + "fieldname": "drop_ship", + "fieldtype": "Section 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, + "label": "Drop Ship", + "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, + "depends_on": "", + "fieldname": "customer", + "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": "Customer", + "length": 0, + "no_copy": 0, + "options": "Customer", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "customer_name", + "fieldtype": "Data", + "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": "Customer Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break_19", + "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, + "depends_on": "", + "fieldname": "customer_contact_person", + "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": "Customer Contact", + "length": 0, + "no_copy": 0, + "options": "Contact", + "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, + "fieldname": "customer_contact_display", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "customer_contact_mobile", + "fieldtype": "Small Text", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer Mobile No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "customer_contact_email", + "fieldtype": "Code", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Customer Contact Email", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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": 1, + "columns": 0, + "fieldname": "section_addresses", + "fieldtype": "Section 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, + "label": "Address and Contact", + "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, + "fieldname": "supplier_address", + "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": "Select Supplier Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "print_hide": 1, + "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, + "fieldname": "contact_person", + "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": "Contact Person", + "length": 0, + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "print_hide": 1, + "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, + "depends_on": "", + "fieldname": "address_display", + "fieldtype": "Small Text", + "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": "Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "contact_display", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "contact_mobile", + "fieldtype": "Small Text", + "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": "Mobile No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "contact_email", + "fieldtype": "Small Text", + "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": "Contact Email", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "col_break_address", + "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, + "depends_on": "", + "fieldname": "shipping_address", + "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": "Select Shipping Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "shipping_address_display", + "fieldtype": "Small Text", + "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": "Shipping Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, + "columns": 0, + "fieldname": "currency_and_price_list", + "fieldtype": "Section 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, + "label": "Currency and Price List", + "length": 0, + "no_copy": 0, + "options": "fa fa-tag", + "permlevel": 0, + "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, + "fieldname": "currency", + "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": "Currency", + "length": 0, + "no_copy": 0, + "oldfieldname": "currency", + "oldfieldtype": "Select", + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "conversion_rate", + "fieldtype": "Float", + "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": "Exchange Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "conversion_rate", + "oldfieldtype": "Currency", + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cb_price_list", + "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, + "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, + "fieldname": "buying_price_list", + "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": "Price List", + "length": 0, + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 1, + "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, + "fieldname": "price_list_currency", + "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": "Price List Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "plc_conversion_rate", + "fieldtype": "Float", + "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": "Price List Exchange Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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, + "fieldname": "ignore_pricing_rule", + "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": "Ignore Pricing Rule", + "length": 0, + "no_copy": 1, + "permlevel": 1, + "print_hide": 1, + "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, + "fieldname": "items_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-shopping-cart", + "permlevel": 0, + "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, + "fieldname": "items", + "fieldtype": "Table", + "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": "Items", + "length": 0, + "no_copy": 0, + "oldfieldname": "po_details", + "oldfieldtype": "Table", + "options": "Purchase Order Item", + "permlevel": 0, + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)", + "fieldname": "link_to_mrs", + "fieldtype": "Button", + "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": "Link to material requests", + "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, + "fieldname": "sb_last_purchase", + "fieldtype": "Section 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, + "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, + "fieldname": "base_total", + "fieldtype": "Currency", + "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": "Total (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_net_total", + "fieldtype": "Currency", + "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": "Net Total (Company Currency)", + "length": 0, + "no_copy": 1, + "oldfieldname": "net_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break_26", + "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, + "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, + "fieldname": "total", + "fieldtype": "Currency", + "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": "Total", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "net_total", + "fieldtype": "Currency", + "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": "Net Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "net_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "taxes_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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": "", + "fieldname": "taxes_and_charges", + "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": "Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_other_charges", + "oldfieldtype": "Link", + "options": "Purchase Taxes and Charges Template", + "permlevel": 0, + "print_hide": 1, + "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, + "fieldname": "column_break_50", + "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, + "fieldname": "shipping_rule", + "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": "Shipping Rule", + "length": 0, + "no_copy": 0, + "options": "Shipping Rule", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "section_break_52", + "fieldtype": "Section 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, + "fieldname": "taxes", + "fieldtype": "Table", + "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": "Purchase Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_tax_details", + "oldfieldtype": "Table", + "options": "Purchase Taxes and Charges", + "permlevel": 0, + "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": 1, + "columns": 0, + "fieldname": "sec_tax_breakup", + "fieldtype": "Section 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, + "label": "Tax Breakup", + "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, + "fieldname": "other_charges_calculation", + "fieldtype": "Text", + "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": "Taxes and Charges Calculation", + "length": 0, + "no_copy": 1, + "oldfieldtype": "HTML", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "totals", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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, + "fieldname": "base_taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges (Company Currency)", + "length": 0, + "no_copy": 1, + "oldfieldname": "total_tax", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break_39", + "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, + "fieldname": "taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, + "collapsible_depends_on": "discount_amount", + "columns": 0, + "fieldname": "discount_section", + "fieldtype": "Section 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, + "label": "Additional Discount", + "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, + "default": "Grand Total", + "fieldname": "apply_discount_on", + "fieldtype": "Select", + "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": "Apply Additional Discount On", + "length": 0, + "no_copy": 0, + "options": "\nGrand Total\nNet Total", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "base_discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break_45", + "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, + "fieldname": "additional_discount_percentage", + "fieldtype": "Float", + "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": "Additional Discount Percentage", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, + "fieldname": "totals_section", + "fieldtype": "Section 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, + "fieldname": "base_grand_total", + "fieldtype": "Currency", + "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": "Grand Total (Company Currency)", + "length": 0, + "no_copy": 1, + "oldfieldname": "grand_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "In Words will be visible once you save the Purchase Order.", + "fieldname": "base_in_words", + "fieldtype": "Data", + "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": "In Words (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "rounded_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break4", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "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, + "fieldname": "grand_total", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Grand Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "grand_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "in_words", + "fieldtype": "Data", + "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": "In Words", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words_import", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "advance_paid", + "fieldtype": "Currency", + "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": "Advance Paid", + "length": 0, + "no_copy": 1, + "options": "party_account_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, + "collapsible_depends_on": "terms", + "columns": 0, + "fieldname": "terms_section_break", + "fieldtype": "Section 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, + "label": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-legal", + "permlevel": 0, + "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, + "fieldname": "tc_name", + "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": "Terms", + "length": 0, + "no_copy": 0, + "oldfieldname": "tc_name", + "oldfieldtype": "Link", + "options": "Terms and Conditions", + "permlevel": 0, + "print_hide": 1, + "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, + "fieldname": "terms", + "fieldtype": "Text Editor", + "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": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldname": "terms", + "oldfieldtype": "Text Editor", + "permlevel": 0, + "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": 1, + "columns": 0, + "fieldname": "more_info", + "fieldtype": "Section 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, + "label": "More Information", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "permlevel": 0, + "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, + "default": "Draft", + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Status", + "length": 0, + "no_copy": 1, + "oldfieldname": "status", + "oldfieldtype": "Select", + "options": "\nDraft\nTo Receive and Bill\nTo Bill\nTo Receive\nCompleted\nCancelled\nClosed\nDelivered", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "ref_sq", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Ref SQ", + "length": 0, + "no_copy": 1, + "oldfieldname": "ref_sq", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "party_account_currency", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Party Account Currency", + "length": 0, + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break_74", + "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, + "depends_on": "eval:!doc.__islocal", + "description": "", + "fieldname": "per_received", + "fieldtype": "Percent", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "% Received", + "length": 0, + "no_copy": 1, + "oldfieldname": "per_received", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "depends_on": "eval:!doc.__islocal", + "description": "", + "fieldname": "per_billed", + "fieldtype": "Percent", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "% Billed", + "length": 0, + "no_copy": 1, + "oldfieldname": "per_billed", + "oldfieldtype": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, + "columns": 0, + "fieldname": "column_break5", + "fieldtype": "Section 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, + "label": "Printing Settings", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "letter_head", - "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": "Letter Head", - "length": 0, - "no_copy": 0, - "oldfieldname": "letter_head", - "oldfieldtype": "Select", - "options": "Letter Head", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "letter_head", + "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": "Letter Head", + "length": 0, + "no_copy": 0, + "oldfieldname": "letter_head", + "oldfieldtype": "Select", + "options": "Letter Head", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "select_print_heading", - "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": "Print Heading", - "length": 0, - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "select_print_heading", + "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": "Print Heading", + "length": 0, + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "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, - "fieldname": "column_break_86", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_86", + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "group_same_items", - "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": "Group same items", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "group_same_items", + "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": "Group same items", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "default": "", - "fieldname": "language", - "fieldtype": "Data", - "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": "Print Language", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "", + "fieldname": "language", + "fieldtype": "Data", + "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": "Print Language", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "collapsible_depends_on": "supplied_items", - "columns": 0, - "description": "", - "fieldname": "raw_material_details", - "fieldtype": "Section 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, - "label": "Raw Materials Supplied", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-truck", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "supplied_items", + "columns": 0, + "description": "", + "fieldname": "raw_material_details", + "fieldtype": "Section 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, + "label": "Raw Materials Supplied", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-truck", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "supplied_items", - "fieldtype": "Table", - "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": "Supplied Items", - "length": 0, - "no_copy": 0, - "oldfieldname": "po_raw_material_details", - "oldfieldtype": "Table", - "options": "Purchase Order Item Supplied", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplied_items", + "fieldtype": "Table", + "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": "Supplied Items", + "length": 0, + "no_copy": 0, + "oldfieldname": "po_raw_material_details", + "oldfieldtype": "Table", + "options": "Purchase Order Item Supplied", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "", - "fieldname": "from_date", - "fieldtype": "Date", - "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": "From Date", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "description": "", + "fieldname": "from_date", + "fieldtype": "Date", + "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": "From Date", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "", - "fieldname": "to_date", - "fieldtype": "Date", - "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": "To Date", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "description": "", + "fieldname": "to_date", + "fieldtype": "Date", + "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": "To Date", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "column_break_97", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_97", + "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-file-text", - "idx": 105, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-11-15 01:03:44.591992", - "modified_by": "Administrator", - "module": "Buying", - "name": "Purchase Order", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-file-text", + "idx": 105, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-11-15 01:03:44.591992", + "modified_by": "Administrator", + "module": "Buying", + "name": "Purchase Order", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 1, - "role": "Stock User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 1, + "role": "Stock User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 1, - "print": 0, - "read": 1, - "report": 0, - "role": "Purchase Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 1, - "search_fields": "status, transaction_date, supplier,grand_total", - "show_name_in_global_search": 1, - "sort_field": "modified", - "sort_order": "DESC", - "timeline_field": "supplier", - "title_field": "title", - "track_changes": 0, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 1, + "search_fields": "status, transaction_date, supplier,grand_total", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC", + "timeline_field": "supplier", + "title_field": "title", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js new file mode 100644 index 00000000000..96775eb0075 --- /dev/null +++ b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js @@ -0,0 +1,43 @@ +QUnit.module('Buying'); + +QUnit.test("test: purchase order with shipping rule", function(assert) { + assert.expect(3); + let done = assert.async(); + + frappe.run_serially([ + () => { + return frappe.tests.make('Purchase Order', [ + {supplier: 'Test Supplier'}, + {is_subcontracted: 'No'}, + {buying_price_list: 'Test-Buying-USD'}, + {currency: 'USD'}, + {"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)}, + {items: [ + [ + {"item_code": 'Test Product 4'}, + {"qty": 5}, + {"uom": 'Unit'}, + {"rate": 500 }, + {"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)}, + {"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)}, + {"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} + ] + ]}, + + {shipping_rule:'Two Day Shipping'} + ]); + }, + + () => { + // Check grand total + assert.ok(cur_frm.doc.total_taxes_and_charges == 200, "Taxes and charges correct"); + assert.ok(cur_frm.doc.grand_total == 2700, "Grand total correct"); + }, + + () => frappe.timeout(0.3), + () => frappe.tests.click_button('Submit'), + () => frappe.tests.click_button('Yes'), + () => frappe.timeout(0.3), + () => done() + ]); +}); \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index 67bf6bd0893..d9bba4218bc 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -1,2492 +1,2581 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "naming_series:", - "beta": 0, - "creation": "2013-05-21 16:16:45", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 0, + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "beta": 0, + "creation": "2013-05-21 16:16:45", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 0, "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "options": "fa fa-user", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "options": "fa fa-user", + "permlevel": 0, + "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, - "default": "{supplier_name}", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Title", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "{supplier_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Title", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "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, - "fieldname": "naming_series", - "fieldtype": "Select", - "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": "Series", - "length": 0, - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "SQTN-", - "permlevel": 0, - "print_hide": 1, - "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": 1, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "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": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "SQTN-", + "permlevel": 0, + "print_hide": 1, + "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": 1, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "supplier", - "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": 1, - "label": "Supplier", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier", - "oldfieldtype": "Link", - "options": "Supplier", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "supplier", + "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": 1, + "label": "Supplier", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier", + "oldfieldtype": "Link", + "options": "Supplier", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Name", - "length": 0, - "no_copy": 0, - "options": "supplier.supplier_name", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Name", + "length": 0, + "no_copy": 0, + "options": "supplier.supplier_name", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break1", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break1", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Today", - "fieldname": "transaction_date", - "fieldtype": "Date", - "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": "Date", - "length": 0, - "no_copy": 0, - "oldfieldname": "transaction_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Today", + "fieldname": "transaction_date", + "fieldtype": "Date", + "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": "Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "transaction_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Data", - "options": "Supplier Quotation", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Data", + "options": "Supplier Quotation", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "", - "fieldname": "company", - "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": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "company", + "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": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "fieldname": "address_section", - "fieldtype": "Section 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, - "label": "Address and Contact", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "address_section", + "fieldtype": "Section 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, + "label": "Address and Contact", + "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, - "fieldname": "supplier_address", - "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": "Supplier Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_address", + "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": "Supplier Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "contact_person", - "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": "Contact Person", - "length": 0, - "no_copy": 0, - "options": "Contact", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_person", + "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": "Contact Person", + "length": 0, + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "address_display", - "fieldtype": "Small Text", - "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": "Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "address_display", + "fieldtype": "Small Text", + "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": "Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_display", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_display", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_mobile", - "fieldtype": "Small Text", - "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": "Mobile No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_mobile", + "fieldtype": "Small Text", + "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": "Mobile No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_email", - "fieldtype": "Data", - "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": "Contact Email", - "length": 0, - "no_copy": 0, - "options": "Email", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_email", + "fieldtype": "Data", + "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": "Contact Email", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "currency_and_price_list", - "fieldtype": "Section 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, - "label": "Currency and Price List", - "length": 0, - "no_copy": 0, - "options": "fa fa-tag", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "currency_and_price_list", + "fieldtype": "Section 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, + "label": "Currency and Price List", + "length": 0, + "no_copy": 0, + "options": "fa fa-tag", + "permlevel": 0, + "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, - "fieldname": "currency", - "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": "Currency", - "length": 0, - "no_copy": 0, - "oldfieldname": "currency", - "oldfieldtype": "Select", - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "currency", + "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": "Currency", + "length": 0, + "no_copy": 0, + "oldfieldname": "currency", + "oldfieldtype": "Select", + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "conversion_rate", - "fieldtype": "Float", - "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": "Exchange Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "conversion_rate", - "oldfieldtype": "Currency", - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "conversion_rate", + "fieldtype": "Float", + "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": "Exchange Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "conversion_rate", + "oldfieldtype": "Currency", + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "cb_price_list", - "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, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "cb_price_list", + "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, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "buying_price_list", - "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": "Price List", - "length": 0, - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "buying_price_list", + "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": "Price List", + "length": 0, + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 1, + "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, - "depends_on": "buying_price_list", - "fieldname": "price_list_currency", - "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": "Price List Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "buying_price_list", + "fieldname": "price_list_currency", + "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": "Price List Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "depends_on": "buying_price_list", - "fieldname": "plc_conversion_rate", - "fieldtype": "Float", - "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": "Price List Exchange Rate", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "buying_price_list", + "fieldname": "plc_conversion_rate", + "fieldtype": "Float", + "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": "Price List Exchange Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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, - "fieldname": "ignore_pricing_rule", - "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": "Ignore Pricing Rule", - "length": 0, - "no_copy": 1, - "permlevel": 1, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "ignore_pricing_rule", + "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": "Ignore Pricing Rule", + "length": 0, + "no_copy": 1, + "permlevel": 1, + "print_hide": 1, + "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, - "fieldname": "items_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-shopping-cart", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "items_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-shopping-cart", + "permlevel": 0, + "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, - "fieldname": "items", - "fieldtype": "Table", - "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": "Items", - "length": 0, - "no_copy": 0, - "oldfieldname": "po_details", - "oldfieldtype": "Table", - "options": "Supplier Quotation Item", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "items", + "fieldtype": "Table", + "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": "Items", + "length": 0, + "no_copy": 0, + "oldfieldname": "po_details", + "oldfieldtype": "Table", + "options": "Supplier Quotation Item", + "permlevel": 0, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)", - "fieldname": "link_to_mrs", - "fieldtype": "Button", - "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": "Link to material requests", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)", + "fieldname": "link_to_mrs", + "fieldtype": "Button", + "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": "Link to material requests", + "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, - "fieldname": "section_break_22", - "fieldtype": "Section 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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_22", + "fieldtype": "Section 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, + "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, - "fieldname": "base_total", - "fieldtype": "Currency", - "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": "Total (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_total", + "fieldtype": "Currency", + "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": "Total (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_net_total", - "fieldtype": "Currency", - "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": "Net Total (Company Currency)", - "length": 0, - "no_copy": 1, - "oldfieldname": "net_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_net_total", + "fieldtype": "Currency", + "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": "Net Total (Company Currency)", + "length": 0, + "no_copy": 1, + "oldfieldname": "net_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_24", - "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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_24", + "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, + "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, - "fieldname": "total", - "fieldtype": "Currency", - "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": "Total", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total", + "fieldtype": "Currency", + "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": "Total", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "net_total", - "fieldtype": "Currency", - "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": "Net Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "net_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "net_total", + "fieldtype": "Currency", + "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": "Net Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "net_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_section", - "fieldtype": "Section 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, - "label": "Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_section", + "fieldtype": "Section 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, + "label": "Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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": "", - "fieldname": "taxes_and_charges", - "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": "Taxes and Charges", - "length": 0, - "no_copy": 1, - "oldfieldname": "purchase_other_charges", - "oldfieldtype": "Link", - "options": "Purchase Taxes and Charges Template", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "taxes_and_charges", + "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": "Taxes and Charges", + "length": 0, + "no_copy": 1, + "oldfieldname": "purchase_other_charges", + "oldfieldtype": "Link", + "options": "Purchase Taxes and Charges Template", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "taxes", - "fieldtype": "Table", - "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": "Purchase Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_tax_details", - "oldfieldtype": "Table", - "options": "Purchase Taxes and Charges", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_36", + "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": 1, - "columns": 0, - "fieldname": "tax_breakup", - "fieldtype": "Section 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, - "label": "Tax Breakup", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_rule", + "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": "Shipping Rule", + "length": 0, + "no_copy": 0, + "options": "Shipping Rule", + "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, - "fieldname": "other_charges_calculation", - "fieldtype": "Text", - "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": "Taxes and Charges Calculation", - "length": 0, - "no_copy": 1, - "oldfieldtype": "HTML", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_38", + "fieldtype": "Section 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, - "fieldname": "totals", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes", + "fieldtype": "Table", + "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": "Purchase Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_tax_details", + "oldfieldtype": "Table", + "options": "Purchase Taxes and Charges", + "permlevel": 0, + "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, - "fieldname": "base_taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "tax_breakup", + "fieldtype": "Section 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, + "label": "Tax Breakup", + "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, - "fieldname": "base_taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "other_charges_calculation", + "fieldtype": "Text", + "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": "Taxes and Charges Calculation", + "length": 0, + "no_copy": 1, + "oldfieldtype": "HTML", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges (Company Currency)", - "length": 0, - "no_copy": 1, - "oldfieldname": "total_tax", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "totals", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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, - "fieldname": "column_break_37", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges (Company Currency)", + "length": 0, + "no_copy": 1, + "oldfieldname": "total_tax", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_37", + "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": 1, - "collapsible_depends_on": "discount_amount", - "columns": 0, - "fieldname": "section_break_41", - "fieldtype": "Section 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, - "label": "Additional Discount", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "default": "Grand Total", - "fieldname": "apply_discount_on", - "fieldtype": "Select", - "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": "Apply Additional Discount On", - "length": 0, - "no_copy": 0, - "options": "\nGrand Total\nNet Total", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_43", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "discount_amount", + "columns": 0, + "fieldname": "section_break_41", + "fieldtype": "Section 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, + "label": "Additional Discount", + "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, - "fieldname": "additional_discount_percentage", - "fieldtype": "Float", - "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": "Additional Discount Percentage", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Grand Total", + "fieldname": "apply_discount_on", + "fieldtype": "Select", + "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": "Apply Additional Discount On", + "length": 0, + "no_copy": 0, + "options": "\nGrand Total\nNet Total", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "section_break_46", - "fieldtype": "Section 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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_43", + "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, - "fieldname": "base_grand_total", - "fieldtype": "Currency", - "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": "Grand Total (Company Currency)", - "length": 0, - "no_copy": 1, - "oldfieldname": "grand_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "additional_discount_percentage", + "fieldtype": "Float", + "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": "Additional Discount Percentage", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "base_rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment (Company Currency", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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": "", - "fieldname": "base_in_words", - "fieldtype": "Data", - "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": "In Words (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_46", + "fieldtype": "Section 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, - "fieldname": "base_rounded_total", - "fieldtype": "Currency", - "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": "Rounded Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "rounded_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_grand_total", + "fieldtype": "Currency", + "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": "Grand Total (Company Currency)", + "length": 0, + "no_copy": 1, + "oldfieldname": "grand_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break4", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "grand_total", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grand Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "grand_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "base_in_words", + "fieldtype": "Data", + "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": "In Words (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "rounded_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "in_words", - "fieldtype": "Data", - "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": "In Words", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words_import", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break4", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "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": 1, - "collapsible_depends_on": "terms", - "columns": 0, - "fieldname": "terms_section_break", - "fieldtype": "Section 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, - "label": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-legal", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "grand_total", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Grand Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "grand_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "tc_name", - "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": "Terms", - "length": 0, - "no_copy": 0, - "oldfieldname": "tc_name", - "oldfieldtype": "Link", - "options": "Terms and Conditions", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "terms", - "fieldtype": "Text Editor", - "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": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "oldfieldname": "terms", - "oldfieldtype": "Text Editor", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "in_words", + "fieldtype": "Data", + "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": "In Words", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words_import", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "printing_settings", - "fieldtype": "Section 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, - "label": "Printing Settings", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "terms", + "columns": 0, + "fieldname": "terms_section_break", + "fieldtype": "Section 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, + "label": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-legal", + "permlevel": 0, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "select_print_heading", - "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": "Print Heading", - "length": 0, - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tc_name", + "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": "Terms", + "length": 0, + "no_copy": 0, + "oldfieldname": "tc_name", + "oldfieldtype": "Link", + "options": "Terms and Conditions", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "letter_head", - "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": "Letter Head", - "length": 0, - "no_copy": 0, - "oldfieldname": "letter_head", - "oldfieldtype": "Select", - "options": "Letter Head", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "terms", + "fieldtype": "Text Editor", + "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": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldname": "terms", + "oldfieldtype": "Text Editor", + "permlevel": 0, + "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, - "fieldname": "language", - "fieldtype": "Data", - "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": "Print Language", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "printing_settings", + "fieldtype": "Section 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, + "label": "Printing Settings", + "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, - "fieldname": "subscription_section", - "fieldtype": "Section 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, - "label": "Subscription Section", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "select_print_heading", + "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": "Print Heading", + "length": 0, + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "letter_head", + "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": "Letter Head", + "length": 0, + "no_copy": 0, + "oldfieldname": "letter_head", + "oldfieldtype": "Select", + "options": "Letter Head", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "columns": 0, - "fieldname": "more_info", - "fieldtype": "Section 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, - "label": "More Information", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-file-text", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "language", + "fieldtype": "Data", + "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": "Print Language", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "status", - "fieldtype": "Select", - "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": "Status", - "length": 0, - "no_copy": 1, - "oldfieldname": "status", - "oldfieldtype": "Select", - "options": "\nDraft\nSubmitted\nStopped\nCancelled", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_section", + "fieldtype": "Section 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, + "label": "Subscription Section", + "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, - "fieldname": "column_break_57", - "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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "default": "No", - "fieldname": "is_subcontracted", - "fieldtype": "Select", - "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": "Is Subcontracted", - "length": 0, - "no_copy": 0, - "options": "\nYes\nNo", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "more_info", + "fieldtype": "Section 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, + "label": "More Information", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-file-text", + "permlevel": 0, + "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, - "fieldname": "reference", - "fieldtype": "Section 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, - "label": "Reference", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "status", + "fieldtype": "Select", + "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": "Status", + "length": 0, + "no_copy": 1, + "oldfieldname": "status", + "oldfieldtype": "Select", + "options": "\nDraft\nSubmitted\nStopped\nCancelled", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "opportunity", - "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": "Opportunity", - "length": 0, - "no_copy": 1, - "options": "Opportunity", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_57", + "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, + "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, + "default": "No", + "fieldname": "is_subcontracted", + "fieldtype": "Select", + "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": "Is Subcontracted", + "length": 0, + "no_copy": 0, + "options": "\nYes\nNo", + "permlevel": 0, + "print_hide": 1, + "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, + "fieldname": "reference", + "fieldtype": "Section 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, + "label": "Reference", + "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, + "fieldname": "opportunity", + "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": "Opportunity", + "length": 0, + "no_copy": 1, + "options": "Opportunity", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-shopping-cart", - "idx": 29, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2017-11-15 01:01:44.094596", - "modified_by": "Administrator", - "module": "Buying", - "name": "Supplier Quotation", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-shopping-cart", + "idx": 29, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "menu_index": 0, + "modified": "2017-11-15 01:01:44.094596", + "modified_by": "Administrator", + "module": "Buying", + "name": "Supplier Quotation", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Manufacturing Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Manufacturing Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Stock User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 1, - "print": 0, - "read": 1, - "report": 0, - "role": "Purchase Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 1, - "search_fields": "status, transaction_date, supplier,grand_total", - "show_name_in_global_search": 1, - "sort_field": "modified", - "sort_order": "DESC", - "timeline_field": "supplier", - "title_field": "title", - "track_changes": 0, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 1, + "search_fields": "status, transaction_date, supplier,grand_total", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC", + "timeline_field": "supplier", + "title_field": "title", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 429d6eb425e..3cefaff42a9 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -299,6 +299,27 @@ class AccountsController(TransactionBase): "allocated_amount": flt(d.amount) if d.against_order else 0 }) + def apply_shipping_rule(self): + if self.shipping_rule: + shipping_rule = frappe.get_doc("Shipping Rule", self.shipping_rule) + shipping_rule.apply(self) + self.calculate_taxes_and_totals() + + def get_shipping_address(self): + '''Returns Address object from shipping address fields if present''' + + # shipping address fields can be `shipping_address_name` or `shipping_address` + # try getting value from both + + for fieldname in ('shipping_address_name', 'shipping_address'): + shipping_field = self.meta.get_field(fieldname) + if shipping_field and shipping_field.fieldtype == 'Link': + if self.get(fieldname): + return frappe.get_doc('Address', self.get(fieldname)) + + return {} + + def get_advance_entries(self, include_unallocated=True): if self.doctype == "Sales Invoice": party_account = self.debit_to diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index d3010818e5a..a31db6484c5 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -420,4 +420,5 @@ class BuyingController(StockController): if d.schedule_date and getdate(d.schedule_date) < getdate(self.transaction_date): frappe.throw(_("Expected Date cannot be before Transaction Date")) else: - frappe.throw(_("Please enter Schedule Date")) \ No newline at end of file + frappe.throw(_("Please enter Schedule Date")) + diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 0e15eee521c..75704b0720f 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -66,38 +66,6 @@ class SellingController(StockController): self.set_price_list_currency("Selling") self.set_missing_item_details(for_validate=for_validate) - def apply_shipping_rule(self): - if self.shipping_rule: - shipping_rule = frappe.get_doc("Shipping Rule", self.shipping_rule) - value = self.base_net_total - - # TODO - # shipping rule calculation based on item's net weight - - shipping_amount = 0.0 - for condition in shipping_rule.get("conditions"): - if not condition.to_value or (flt(condition.from_value) <= value <= flt(condition.to_value)): - shipping_amount = condition.shipping_amount - break - - shipping_charge = { - "doctype": "Sales Taxes and Charges", - "charge_type": "Actual", - "account_head": shipping_rule.account, - "cost_center": shipping_rule.cost_center - } - - existing_shipping_charge = self.get("taxes", filters=shipping_charge) - if existing_shipping_charge: - # take the last record found - existing_shipping_charge[-1].tax_amount = shipping_amount - else: - shipping_charge["tax_amount"] = shipping_amount - shipping_charge["description"] = shipping_rule.label - self.append("taxes", shipping_charge) - - self.calculate_taxes_and_totals() - def remove_shipping_charge(self): if self.shipping_rule: shipping_rule = frappe.get_doc("Shipping Rule", self.shipping_rule) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 2b2191c0d91..874ea5082ad 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -233,7 +233,8 @@ class calculate_taxes_and_totals(object): # if tax/charges is for deduction, multiply by -1 if getattr(tax, "category", None): tax_amount = 0.0 if (tax.category == "Valuation") else tax_amount - tax_amount *= -1.0 if (tax.add_deduct_tax == "Deduct") else 1.0 + if self.doc.doctype in ["Purchase Order", "Purchase Invoice", "Purchase Receipt", "Supplier Quotation"]: + tax_amount *= -1.0 if (tax.add_deduct_tax == "Deduct") else 1.0 return tax_amount def set_cumulative_total(self, row_idx, tax): diff --git a/erpnext/docs/assets/img/selling/shipping-rule.png b/erpnext/docs/assets/img/selling/shipping-rule.png index 7cd9b46bcf82a99629db8654014608c37f5105d9..7f2a63de5c737a74e066eeda445fe09f290e48c5 100644 GIT binary patch literal 219666 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

H-500X83%zzrUTQ&4)d;tdHfwA6-?3 zMwz~=44Yf)-Us||gq*=nAo!xms`IMg?@@TpCzyVZa+Q}JKi&z*N`C}oT2tF_nYrD}i>$qu z%4Rv>0b`(To>r*?r_HUd1*2UwmXfY!lW3DbT3|?Bbkb?2M4@>!yKsMN`aCAaZLbBx zR7UqL#*_6b^S&}N7y?7eY=a^0&M?$88zwrz8}`tFCMASr2-%t>yX=i!z=}D3-EGP~ zw1O=*X*H2Fy+Rl5(;w(H^dC+Wo#oCN*vMorUi^S_&N0#OdD6?N7Q#>W8Va5DfC*X+ z{)DnIdDw9lp1{QVohPj{DelhNz!AhHKomP=j6e6^yV*cO=LTtfKgG!iGt;i|+$(+6;pG~ z%*H2ebc5rwIyt=f`z@tXt(0y0^T&z-d&=IO{f4PP;lVH!732ZbzZrbXXwxa<{F{09 z{VI+kw>|YLdy1z>ps@Lz-W?*c#=R=m_Y&mv(

j)+a`oXCp^ClQe`YGVM`Wgkx2O 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 literal 89566 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 diff --git a/erpnext/docs/user/manual/en/selling/setup/shipping-rule.md b/erpnext/docs/user/manual/en/selling/setup/shipping-rule.md index 0d8c269fc2a..9b25c8c8638 100644 --- a/erpnext/docs/user/manual/en/selling/setup/shipping-rule.md +++ b/erpnext/docs/user/manual/en/selling/setup/shipping-rule.md @@ -1,7 +1,7 @@ # Shipping Rule -Using Shipping Rule you can define the cost for delivering the product to the customer. -You can define different shipping rules for the same item across different territories. +Using Shipping Rule you can define the cost for delivering the product to the customer and also to the supplier. +You can define different shipping rules or a fixed shipping amount for the same item across different territories. Shipping Rule diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 0268690fc9d..bc63f4a794e 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -464,3 +464,4 @@ erpnext.patches.v9_0.update_employee_loan_details erpnext.patches.v9_2.delete_healthcare_domain_default_items erpnext.patches.v9_1.create_issue_opportunity_type erpnext.patches.v9_2.rename_translated_domains_in_en +erpnext.patches.v9_0.set_shipping_type_for_existing_shipping_rules diff --git a/erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py b/erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py new file mode 100644 index 00000000000..5092695b7d9 --- /dev/null +++ b/erpnext/patches/v9_0/set_shipping_type_for_existing_shipping_rules.py @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doctype("Shipping Rule") + + # default "calculate_based_on" + frappe.db.sql('''update `tabShipping Rule` + set calculate_based_on = "Net Weight" + where ifnull(calculate_based_on, '') = '' ''') + + # default "shipping_rule_type" + frappe.db.sql('''update `tabShipping Rule` + set shipping_rule_type = "Selling" + where ifnull(shipping_rule_type, '') = '' ''') diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index 010d4d92692..a9e3ad4e924 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -18,6 +18,14 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ this.setup_queries(); this._super(); + this.frm.set_query('shipping_rule', function() { + return { + filters: { + "shipping_rule_type": "Buying" + } + }; + }); + /* eslint-disable */ // no idea where me is coming from if(this.frm.get_field('shipping_address')) { diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index b07d0902a3e..f53013773e0 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -36,7 +36,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ cur_frm.cscript.set_gross_profit(item); cur_frm.cscript.calculate_taxes_and_totals(); - }) + }); frappe.ui.form.on(this.frm.cscript.tax_table, "rate", function(frm, cdt, cdn) { cur_frm.cscript.calculate_taxes_and_totals(); @@ -98,7 +98,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ var me = this; if(this.frm.fields_dict["items"].grid.get_field('batch_no')) { this.frm.set_query("batch_no", "items", function(doc, cdt, cdn) { - return me.set_query_for_batch(doc, cdt, cdn) + return me.set_query_for_batch(doc, cdt, cdn); }); } @@ -116,7 +116,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ filters: [ ['Print Format', 'doc_type', '=', cur_frm.doctype], ] - } + }; }); } @@ -553,6 +553,21 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ this.frm.set_df_property("conversion_rate", "read_only", erpnext.stale_rate_allowed()); }, + shipping_rule: function() { + var me = this; + if(this.frm.doc.shipping_rule) { + return this.frm.call({ + doc: this.frm.doc, + method: "apply_shipping_rule", + callback: function(r) { + if(!r.exc) { + me.calculate_taxes_and_totals(); + } + } + }).fail(() => this.frm.set_value('shipping_rule', '')); + } + }, + set_actual_charges_based_on_currency: function() { var me = this; $.each(this.frm.doc.taxes || [], function(i, d) { @@ -701,12 +716,12 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ "base_grand_total", "base_rounded_total", "base_in_words", "base_discount_amount", "base_paid_amount", "base_write_off_amount", "base_operating_cost", "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost", "base_rounding_adjustment"], - this.frm.doc.currency != company_currency); + this.frm.doc.currency != company_currency); this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"], this.frm.doc.price_list_currency != company_currency); - var show =cint(cur_frm.doc.discount_amount) || + var show = cint(cur_frm.doc.discount_amount) || ((cur_frm.doc.taxes || []).filter(function(d) {return d.included_in_print_rate===1}).length); if(frappe.meta.get_docfield(cur_frm.doctype, "net_total")) @@ -816,7 +831,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ if (!r.exc && r.message) { me._set_values_for_item_list(r.message); me.calculate_taxes_and_totals(); - if(me.frm.doc.apply_discount_on) me.frm.trigger("apply_discount_on") + if(me.frm.doc.apply_discount_on) me.frm.trigger("apply_discount_on"); } } }); @@ -895,8 +910,8 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ // if doctype is Quotation Item / Sales Order Iten then add Margin Type and rate in item_list if (in_list(["Quotation Item", "Sales Order Item", "Delivery Note Item", "Sales Invoice Item"]), d.doctype){ - item_list[0]["margin_type"] = d.margin_type - item_list[0]["margin_rate_or_amount"] = d.margin_rate_or_amount + item_list[0]["margin_type"] = d.margin_type; + item_list[0]["margin_rate_or_amount"] = d.margin_rate_or_amount; } } }; @@ -1101,12 +1116,12 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ }, get_method_for_payment: function(){ - var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry" + var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry"; if(cur_frm.doc.__onload && cur_frm.doc.__onload.make_payment_via_journal_entry){ if(in_list(['Sales Invoice', 'Purchase Invoice'], cur_frm.doc.doctype)){ - method = "erpnext.accounts.doctype.journal_entry.journal_entry.get_payment_entry_against_invoice" + method = "erpnext.accounts.doctype.journal_entry.journal_entry.get_payment_entry_against_invoice"; }else { - method= "erpnext.accounts.doctype.journal_entry.journal_entry.get_payment_entry_against_order" + method= "erpnext.accounts.doctype.journal_entry.journal_entry.get_payment_entry_against_order"; } } @@ -1132,9 +1147,9 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ 'item_code': item.item_code, 'posting_date': me.frm.doc.posting_date || frappe.datetime.nowdate(), } - if (item.warehouse) filters["warehouse"] = item.warehouse + if (item.warehouse) filters["warehouse"] = item.warehouse; - return { + return s query : "erpnext.controllers.queries.get_batch_no", filters: filters } diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index e9671c87117..97b7b99d08f 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -17,6 +17,13 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ onload: function() { this._super(); this.setup_queries(); + this.frm.set_query('shipping_rule', function() { + return { + filters: { + "shipping_rule_type": "Selling" + } + }; + }); }, setup_queries: function() { @@ -233,21 +240,6 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ }); }, - shipping_rule: function() { - var me = this; - if(this.frm.doc.shipping_rule) { - return this.frm.call({ - doc: this.frm.doc, - method: "apply_shipping_rule", - callback: function(r) { - if(!r.exc) { - me.calculate_taxes_and_totals(); - } - } - }) - } - }, - batch_no: function(doc, cdt, cdn) { var me = this; var item = frappe.get_doc(cdt, cdn); diff --git a/erpnext/shopping_cart/test_shopping_cart.py b/erpnext/shopping_cart/test_shopping_cart.py index 22b2895043e..387b57c8745 100644 --- a/erpnext/shopping_cart/test_shopping_cart.py +++ b/erpnext/shopping_cart/test_shopping_cart.py @@ -127,6 +127,7 @@ class TestShoppingCart(unittest.TestCase): "selling_price_list": "_Test Price List Rest of the World", "currency": "USD", "taxes_and_charges" : "_Test Tax 1", + "conversion_rate":1, "transaction_date" : nowdate(), "valid_till" : add_months(nowdate(), 1), "items": [{ diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index 21364e76be4..9f634cd6737 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -1,3244 +1,3333 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "naming_series:", - "beta": 0, - "creation": "2013-05-21 16:16:39", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 1, + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "beta": 0, + "creation": "2013-05-21 16:16:39", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "options": "fa fa-user", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "options": "fa fa-user", + "permlevel": 0, + "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, - "fieldname": "column_break0", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break0", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "{supplier_name}", - "fieldname": "title", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Title", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "{supplier_name}", + "fieldname": "title", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Title", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "default": "", - "fieldname": "naming_series", - "fieldtype": "Select", - "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": "Series", - "length": 0, - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "PREC-\nPREC-RET-", - "permlevel": 0, - "print_hide": 1, - "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": 1, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "", + "fieldname": "naming_series", + "fieldtype": "Select", + "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": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "PREC-\nPREC-RET-", + "permlevel": 0, + "print_hide": 1, + "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": 1, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "fieldname": "supplier", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Supplier", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier", - "oldfieldtype": "Link", - "options": "Supplier", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Supplier", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier", + "oldfieldtype": "Link", + "options": "Supplier", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "depends_on": "supplier", - "fieldname": "supplier_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Supplier Name", - "length": 0, - "no_copy": 0, - "options": "supplier.supplier_name", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, + "depends_on": "supplier", + "fieldname": "supplier_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Supplier Name", + "length": 0, + "no_copy": 0, + "options": "supplier.supplier_name", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "supplier_delivery_note", - "fieldtype": "Data", - "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": "Supplier Delivery Note", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_delivery_note", + "fieldtype": "Data", + "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": "Supplier Delivery Note", + "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, - "fieldname": "column_break1", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break1", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Today", - "depends_on": "", - "fieldname": "posting_date", - "fieldtype": "Date", - "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": "Date", - "length": 0, - "no_copy": 1, - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Today", + "depends_on": "", + "fieldname": "posting_date", + "fieldtype": "Date", + "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": "Date", + "length": 0, + "no_copy": 1, + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "description": "Time at which materials were received", - "fieldname": "posting_time", - "fieldtype": "Time", - "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": "Posting Time", - "length": 0, - "no_copy": 1, - "oldfieldname": "posting_time", - "oldfieldtype": "Time", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "100px", - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "description": "Time at which materials were received", + "fieldname": "posting_time", + "fieldtype": "Time", + "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": "Posting Time", + "length": 0, + "no_copy": 1, + "oldfieldname": "posting_time", + "oldfieldtype": "Time", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.docstatus==0", - "fieldname": "set_posting_time", - "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": "Edit Posting Date and Time", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.docstatus==0", + "fieldname": "set_posting_time", + "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": "Edit Posting Date and Time", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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": "", - "fieldname": "company", - "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": 1, - "label": "Company", - "length": 0, - "no_copy": 0, - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 0, - "remember_last_selected_value": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "company", + "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": 1, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 0, + "remember_last_selected_value": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_return", - "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": "Is Return", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "is_return", + "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": "Is Return", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "depends_on": "is_return", - "fieldname": "return_against", - "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": "Return Against Purchase Receipt", - "length": 0, - "no_copy": 1, - "options": "Purchase Receipt", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "is_return", + "fieldname": "return_against", + "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": "Return Against Purchase Receipt", + "length": 0, + "no_copy": 1, + "options": "Purchase Receipt", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "section_addresses", - "fieldtype": "Section 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, - "label": "Address and Contact", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "section_addresses", + "fieldtype": "Section 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, + "label": "Address and Contact", + "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, - "fieldname": "supplier_address", - "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": "Select Supplier Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier_address", + "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": "Select Supplier Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "contact_person", - "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": "Contact Person", - "length": 0, - "no_copy": 0, - "options": "Contact", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_person", + "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": "Contact Person", + "length": 0, + "no_copy": 0, + "options": "Contact", + "permlevel": 0, + "print_hide": 1, + "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, - "depends_on": "", - "fieldname": "address_display", - "fieldtype": "Small Text", - "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": "Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "address_display", + "fieldtype": "Small Text", + "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": "Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_display", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Contact", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_display", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Contact", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_mobile", - "fieldtype": "Small Text", - "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": "Mobile No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_mobile", + "fieldtype": "Small Text", + "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": "Mobile No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "contact_email", - "fieldtype": "Small Text", - "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": "Contact Email", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "contact_email", + "fieldtype": "Small Text", + "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": "Contact Email", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "col_break_address", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "col_break_address", + "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, - "depends_on": "", - "fieldname": "shipping_address", - "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": "Select Shipping Address", - "length": 0, - "no_copy": 0, - "options": "Address", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "shipping_address", + "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": "Select Shipping Address", + "length": 0, + "no_copy": 0, + "options": "Address", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "shipping_address_display", - "fieldtype": "Small Text", - "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": "Shipping Address", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_address_display", + "fieldtype": "Small Text", + "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": "Shipping Address", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "currency_and_price_list", - "fieldtype": "Section 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, - "label": "Currency and Price List", - "length": 0, - "no_copy": 0, - "options": "fa fa-tag", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "currency_and_price_list", + "fieldtype": "Section 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, + "label": "Currency and Price List", + "length": 0, + "no_copy": 0, + "options": "fa fa-tag", + "permlevel": 0, + "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, - "fieldname": "currency", - "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": "Currency", - "length": 0, - "no_copy": 0, - "oldfieldname": "currency", - "oldfieldtype": "Select", - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "currency", + "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": "Currency", + "length": 0, + "no_copy": 0, + "oldfieldname": "currency", + "oldfieldtype": "Select", + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Rate at which supplier's currency is converted to company's base currency", - "fieldname": "conversion_rate", - "fieldtype": "Float", - "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": "Exchange Rate", - "length": 0, - "no_copy": 0, - "oldfieldname": "conversion_rate", - "oldfieldtype": "Currency", - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Rate at which supplier's currency is converted to company's base currency", + "fieldname": "conversion_rate", + "fieldtype": "Float", + "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": "Exchange Rate", + "length": 0, + "no_copy": 0, + "oldfieldname": "conversion_rate", + "oldfieldtype": "Currency", + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break2", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break2", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "buying_price_list", - "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": "Price List", - "length": 0, - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "buying_price_list", + "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": "Price List", + "length": 0, + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 1, + "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, - "depends_on": "buying_price_list", - "fieldname": "price_list_currency", - "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": "Price List Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "buying_price_list", + "fieldname": "price_list_currency", + "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": "Price List Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "depends_on": "buying_price_list", - "fieldname": "plc_conversion_rate", - "fieldtype": "Float", - "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": "Price List Exchange Rate", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "9", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "buying_price_list", + "fieldname": "plc_conversion_rate", + "fieldtype": "Float", + "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": "Price List Exchange Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "9", + "print_hide": 1, + "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, - "fieldname": "ignore_pricing_rule", - "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": "Ignore Pricing Rule", - "length": 0, - "no_copy": 1, - "permlevel": 1, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "ignore_pricing_rule", + "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": "Ignore Pricing Rule", + "length": 0, + "no_copy": 1, + "permlevel": 1, + "print_hide": 1, + "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, - "fieldname": "items_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-shopping-cart", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "items_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-shopping-cart", + "permlevel": 0, + "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, - "fieldname": "items", - "fieldtype": "Table", - "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": "Items", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_receipt_details", - "oldfieldtype": "Table", - "options": "Purchase Receipt Item", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "items", + "fieldtype": "Table", + "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": "Items", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_receipt_details", + "oldfieldtype": "Table", + "options": "Purchase Receipt Item", + "permlevel": 0, + "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "get_current_stock", - "fieldtype": "Button", - "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": "Get current stock", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Button", - "options": "get_current_stock", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "get_current_stock", + "fieldtype": "Button", + "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": "Get current stock", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Button", + "options": "get_current_stock", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "section_break0", - "fieldtype": "Section 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, - "oldfieldtype": "Section Break", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break0", + "fieldtype": "Section 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, + "oldfieldtype": "Section Break", + "permlevel": 0, + "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, - "fieldname": "base_total", - "fieldtype": "Currency", - "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": "Total (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_total", + "fieldtype": "Currency", + "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": "Total (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_net_total", - "fieldtype": "Currency", - "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": "Net Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "net_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_net_total", + "fieldtype": "Currency", + "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": "Net Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "net_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_27", - "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, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_27", + "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, + "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, - "fieldname": "total", - "fieldtype": "Currency", - "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": "Total", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total", + "fieldtype": "Currency", + "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": "Total", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "net_total", - "fieldtype": "Currency", - "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": "Net Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "net_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "net_total", + "fieldtype": "Currency", + "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": "Net Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "net_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "Add / Edit Taxes and Charges", - "fieldname": "taxes_section", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Add / Edit Taxes and Charges", + "fieldname": "taxes_charges_section", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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": "", - "fieldname": "taxes_and_charges", - "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": "Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_other_charges", - "oldfieldtype": "Link", - "options": "Purchase Taxes and Charges Template", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "taxes_and_charges", + "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": "Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_other_charges", + "oldfieldtype": "Link", + "options": "Purchase Taxes and Charges Template", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "taxes", - "fieldtype": "Table", - "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": "Purchase Taxes and Charges", - "length": 0, - "no_copy": 0, - "oldfieldname": "purchase_tax_details", - "oldfieldtype": "Table", - "options": "Purchase Taxes and Charges", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_col", + "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": 1, - "columns": 0, - "fieldname": "sec_tax_breakup", - "fieldtype": "Section 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, - "label": "Tax Breakup", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "shipping_rule", + "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": "Shipping Rule", + "length": 0, + "no_copy": 0, + "options": "Shipping Rule", + "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, - "fieldname": "other_charges_calculation", - "fieldtype": "Text", - "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": "Taxes and Charges Calculation", - "length": 0, - "no_copy": 1, - "oldfieldtype": "HTML", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_section", + "fieldtype": "Section 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": "", - "fieldname": "totals", - "fieldtype": "Section 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, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes", + "fieldtype": "Table", + "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": "Purchase Taxes and Charges", + "length": 0, + "no_copy": 0, + "oldfieldname": "purchase_tax_details", + "oldfieldtype": "Table", + "options": "Purchase Taxes and Charges", + "permlevel": 0, + "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, - "fieldname": "base_taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "sec_tax_breakup", + "fieldtype": "Section 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, + "label": "Tax Breakup", + "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, - "fieldname": "base_taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "other_charges_calculation", + "fieldtype": "Text", + "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": "Taxes and Charges Calculation", + "length": 0, + "no_copy": 1, + "oldfieldtype": "HTML", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "total_tax", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "totals", + "fieldtype": "Section 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, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "permlevel": 0, + "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, - "fieldname": "column_break3", - "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, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "base_taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "base_total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "total_tax", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, + "fieldname": "column_break3", + "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, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "taxes_and_charges_added", - "fieldtype": "Currency", - "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": "Taxes and Charges Added", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_added_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges_added", + "fieldtype": "Currency", + "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": "Taxes and Charges Added", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_added_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "taxes_and_charges_deducted", - "fieldtype": "Currency", - "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": "Taxes and Charges Deducted", - "length": 0, - "no_copy": 0, - "oldfieldname": "other_charges_deducted_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "taxes_and_charges_deducted", + "fieldtype": "Currency", + "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": "Taxes and Charges Deducted", + "length": 0, + "no_copy": 0, + "oldfieldname": "other_charges_deducted_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "total_taxes_and_charges", - "fieldtype": "Currency", - "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": "Total Taxes and Charges", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_taxes_and_charges", + "fieldtype": "Currency", + "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": "Total Taxes and Charges", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "collapsible_depends_on": "discount_amount", - "columns": 0, - "fieldname": "section_break_42", - "fieldtype": "Section 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, - "label": "Additional Discount", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "discount_amount", + "columns": 0, + "fieldname": "section_break_42", + "fieldtype": "Section 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, + "label": "Additional Discount", + "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, - "default": "Grand Total", - "fieldname": "apply_discount_on", - "fieldtype": "Select", - "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": "Apply Additional Discount On", - "length": 0, - "no_copy": 0, - "options": "\nGrand Total\nNet Total", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Grand Total", + "fieldname": "apply_discount_on", + "fieldtype": "Select", + "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": "Apply Additional Discount On", + "length": 0, + "no_copy": 0, + "options": "\nGrand Total\nNet Total", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "base_discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount (Company Currency)", - "length": 0, - "no_copy": 0, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount (Company Currency)", + "length": 0, + "no_copy": 0, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_44", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_44", + "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, - "fieldname": "additional_discount_percentage", - "fieldtype": "Float", - "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": "Additional Discount Percentage", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "additional_discount_percentage", + "fieldtype": "Float", + "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": "Additional Discount Percentage", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "discount_amount", - "fieldtype": "Currency", - "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": "Additional Discount Amount", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "discount_amount", + "fieldtype": "Currency", + "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": "Additional Discount Amount", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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, - "fieldname": "section_break_46", - "fieldtype": "Section 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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_46", + "fieldtype": "Section 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, - "fieldname": "base_grand_total", - "fieldtype": "Currency", - "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": "Grand Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "grand_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_grand_total", + "fieldtype": "Currency", + "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": "Grand Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "grand_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment (Company Currency)", - "length": 0, - "no_copy": 1, - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": "", - "fieldname": "base_in_words", - "fieldtype": "Data", - "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": "In Words (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "", + "fieldname": "base_in_words", + "fieldtype": "Data", + "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": "In Words (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "base_rounded_total", - "fieldtype": "Currency", - "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": "Rounded Total (Company Currency)", - "length": 0, - "no_copy": 0, - "oldfieldname": "rounded_total", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounded_total", + "fieldtype": "Currency", + "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": "Rounded Total (Company Currency)", + "length": 0, + "no_copy": 0, + "oldfieldname": "rounded_total", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "column_break_50", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_50", + "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, - "fieldname": "grand_total", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Grand Total", - "length": 0, - "no_copy": 0, - "oldfieldname": "grand_total_import", - "oldfieldtype": "Currency", - "options": "currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "grand_total", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Grand Total", + "length": 0, + "no_copy": 0, + "oldfieldname": "grand_total_import", + "oldfieldtype": "Currency", + "options": "currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "rounding_adjustment", - "fieldtype": "Currency", - "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": "Rounding Adjustment", - "length": 0, - "no_copy": 1, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "in_words", - "fieldtype": "Data", - "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": "In Words", - "length": 0, - "no_copy": 0, - "oldfieldname": "in_words_import", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "in_words", + "fieldtype": "Data", + "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": "In Words", + "length": 0, + "no_copy": 0, + "oldfieldname": "in_words_import", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "collapsible_depends_on": "terms", - "columns": 0, - "fieldname": "terms_section_break", - "fieldtype": "Section 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, - "label": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-legal", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "terms", + "columns": 0, + "fieldname": "terms_section_break", + "fieldtype": "Section 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, + "label": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-legal", + "permlevel": 0, + "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, - "fieldname": "tc_name", - "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": "Terms", - "length": 0, - "no_copy": 0, - "oldfieldname": "tc_name", - "oldfieldtype": "Link", - "options": "Terms and Conditions", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "tc_name", + "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": "Terms", + "length": 0, + "no_copy": 0, + "oldfieldname": "tc_name", + "oldfieldtype": "Link", + "options": "Terms and Conditions", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "terms", - "fieldtype": "Text Editor", - "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": "Terms and Conditions", - "length": 0, - "no_copy": 0, - "oldfieldname": "terms", - "oldfieldtype": "Text Editor", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "terms", + "fieldtype": "Text Editor", + "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": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldname": "terms", + "oldfieldtype": "Text Editor", + "permlevel": 0, + "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": 1, - "collapsible_depends_on": "supplied_items", - "columns": 0, - "description": "", - "fieldname": "raw_material_details", - "fieldtype": "Section 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, - "label": "Raw Materials Supplied", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-table", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "supplied_items", + "columns": 0, + "description": "", + "fieldname": "raw_material_details", + "fieldtype": "Section 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, + "label": "Raw Materials Supplied", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-table", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "default": "No", - "description": "", - "fieldname": "is_subcontracted", - "fieldtype": "Select", - "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": "Raw Materials Supplied", - "length": 0, - "no_copy": 0, - "oldfieldname": "is_subcontracted", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "No", + "description": "", + "fieldname": "is_subcontracted", + "fieldtype": "Select", + "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": "Raw Materials Supplied", + "length": 0, + "no_copy": 0, + "oldfieldname": "is_subcontracted", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, + "print_hide": 1, + "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": "", - "fieldname": "supplier_warehouse", - "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": "Supplier Warehouse", - "length": 0, - "no_copy": 1, - "oldfieldname": "supplier_warehouse", - "oldfieldtype": "Link", - "options": "Warehouse", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "50px", - "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": "", + "fieldname": "supplier_warehouse", + "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": "Supplier Warehouse", + "length": 0, + "no_copy": 1, + "oldfieldname": "supplier_warehouse", + "oldfieldtype": "Link", + "options": "Warehouse", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "50px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "supplied_items", - "fieldtype": "Table", - "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": "Supplied Items", - "length": 0, - "no_copy": 1, - "oldfieldname": "pr_raw_material_details", - "oldfieldtype": "Table", - "options": "Purchase Receipt Item Supplied", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplied_items", + "fieldtype": "Table", + "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": "Supplied Items", + "length": 0, + "no_copy": 1, + "oldfieldname": "pr_raw_material_details", + "oldfieldtype": "Table", + "options": "Purchase Receipt Item Supplied", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "bill_no", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Bill No", - "length": 0, - "no_copy": 0, - "oldfieldname": "bill_no", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "bill_no", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Bill No", + "length": 0, + "no_copy": 0, + "oldfieldname": "bill_no", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "bill_date", - "fieldtype": "Date", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Bill Date", - "length": 0, - "no_copy": 0, - "oldfieldname": "bill_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "bill_date", + "fieldtype": "Date", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Bill Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "bill_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "columns": 0, - "fieldname": "more_info", - "fieldtype": "Section 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, - "label": "More Information", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "fa fa-file-text", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "more_info", + "fieldtype": "Section 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, + "label": "More Information", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "fa fa-file-text", + "permlevel": 0, + "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, - "default": "Draft", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Status", - "length": 0, - "no_copy": 1, - "oldfieldname": "status", - "oldfieldtype": "Select", - "options": "\nDraft\nTo Bill\nCompleted\nCancelled\nClosed", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 1, - "set_only_once": 0, - "unique": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Draft", + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 1, + "label": "Status", + "length": 0, + "no_copy": 1, + "oldfieldname": "status", + "oldfieldtype": "Select", + "options": "\nDraft\nTo Bill\nCompleted\nCancelled\nClosed", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Warehouse where you are maintaining stock of rejected items", - "fieldname": "rejected_warehouse", - "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": "Rejected Warehouse", - "length": 0, - "no_copy": 1, - "oldfieldname": "rejected_warehouse", - "oldfieldtype": "Link", - "options": "Warehouse", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Warehouse where you are maintaining stock of rejected items", + "fieldname": "rejected_warehouse", + "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": "Rejected Warehouse", + "length": 0, + "no_copy": 1, + "oldfieldname": "rejected_warehouse", + "oldfieldtype": "Link", + "options": "Warehouse", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Data", - "options": "Purchase Receipt", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 1, - "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, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Data", + "options": "Purchase Receipt", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "150px", + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "150px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "range", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Range", - "length": 0, - "no_copy": 0, - "oldfieldname": "range", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "range", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Range", + "length": 0, + "no_copy": 0, + "oldfieldname": "range", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 1, + "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, - "fieldname": "column_break4", - "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, - "oldfieldtype": "Column Break", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break4", + "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, + "oldfieldtype": "Column Break", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "per_billed", - "fieldtype": "Percent", - "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": "% Amount Billed", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "per_billed", + "fieldtype": "Percent", + "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": "% Amount Billed", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "subscription_detail", - "fieldtype": "Section 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, - "label": "Subscription Detail", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription_detail", + "fieldtype": "Section 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, + "label": "Subscription Detail", + "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, - "fieldname": "subscription", - "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": "Subscription", - "length": 0, - "no_copy": 1, - "options": "Subscription", - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "subscription", + "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": "Subscription", + "length": 0, + "no_copy": 1, + "options": "Subscription", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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": 1, - "columns": 0, - "fieldname": "printing_settings", - "fieldtype": "Section 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, - "label": "Printing Settings", - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "printing_settings", + "fieldtype": "Section 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, + "label": "Printing Settings", + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "letter_head", - "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": "Letter Head", - "length": 0, - "no_copy": 0, - "options": "Letter Head", - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "letter_head", + "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": "Letter Head", + "length": 0, + "no_copy": 0, + "options": "Letter Head", + "permlevel": 0, + "print_hide": 1, + "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": 1, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "select_print_heading", - "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": "Print Heading", - "length": 0, - "no_copy": 1, - "oldfieldname": "select_print_heading", - "oldfieldtype": "Link", - "options": "Print Heading", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "select_print_heading", + "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": "Print Heading", + "length": 0, + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 1, + "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, - "fieldname": "language", - "fieldtype": "Data", - "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": "Print Language", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "language", + "fieldtype": "Data", + "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": "Print Language", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, - "fieldname": "other_details", - "fieldtype": "HTML", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Other Details", - "length": 0, - "no_copy": 0, - "oldfieldtype": "HTML", - "options": "

Other Details
", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "print_width": "30%", - "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, + "fieldname": "other_details", + "fieldtype": "HTML", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Other Details", + "length": 0, + "no_copy": 0, + "oldfieldtype": "HTML", + "options": "
Other Details
", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": "30%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "30%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "instructions", - "fieldtype": "Small Text", - "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": "Instructions", - "length": 0, - "no_copy": 0, - "oldfieldname": "instructions", - "oldfieldtype": "Text", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "instructions", + "fieldtype": "Small Text", + "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": "Instructions", + "length": 0, + "no_copy": 0, + "oldfieldname": "instructions", + "oldfieldtype": "Text", + "permlevel": 0, + "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, - "fieldname": "remarks", - "fieldtype": "Small Text", - "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": "Remarks", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 1, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "remarks", + "fieldtype": "Small Text", + "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": "Remarks", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 1, + "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": 1, - "collapsible_depends_on": "transporter_name", - "columns": 0, - "fieldname": "transporter_info", - "fieldtype": "Section 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, - "label": "Transporter Details", - "length": 0, - "no_copy": 0, - "options": "fa fa-truck", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "transporter_name", + "columns": 0, + "fieldname": "transporter_info", + "fieldtype": "Section 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, + "label": "Transporter Details", + "length": 0, + "no_copy": 0, + "options": "fa fa-truck", + "permlevel": 0, + "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, - "fieldname": "transporter_name", - "fieldtype": "Data", - "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": "Transporter Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "transporter_name", - "oldfieldtype": "Data", - "permlevel": 0, - "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, + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "transporter_name", + "fieldtype": "Data", + "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": "Transporter Name", + "length": 0, + "no_copy": 0, + "oldfieldname": "transporter_name", + "oldfieldtype": "Data", + "permlevel": 0, + "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, - "fieldname": "column_break5", - "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, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "50%", - "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, + "fieldname": "column_break5", + "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, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "lr_no", - "fieldtype": "Data", - "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": "Vehicle Number", - "length": 0, - "no_copy": 1, - "oldfieldname": "lr_no", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "100px", - "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": "", + "fieldname": "lr_no", + "fieldtype": "Data", + "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": "Vehicle Number", + "length": 0, + "no_copy": 1, + "oldfieldname": "lr_no", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "lr_date", - "fieldtype": "Date", - "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": "Vehicle Date", - "length": 0, - "no_copy": 1, - "oldfieldname": "lr_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "100px", - "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": "", + "fieldname": "lr_date", + "fieldtype": "Date", + "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": "Vehicle Date", + "length": 0, + "no_copy": 1, + "oldfieldname": "lr_date", + "oldfieldtype": "Date", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "100px" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-truck", - "idx": 261, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2017-11-15 01:04:31.132077", - "modified_by": "Administrator", - "module": "Stock", - "name": "Purchase Receipt", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "fa fa-truck", + "idx": 261, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "menu_index": 0, + "modified": "2017-11-15 01:04:31.132077", + "modified_by": "Administrator", + "module": "Stock", + "name": "Purchase Receipt", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Stock Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Stock User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 1, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 1, - "print": 0, - "read": 1, - "report": 0, - "role": "Stock Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "Stock Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 1, - "search_fields": "status, posting_date, supplier", - "show_name_in_global_search": 1, - "sort_field": "modified", - "sort_order": "DESC", - "timeline_field": "supplier", - "title_field": "title", - "track_changes": 1, + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 1, + "search_fields": "status, posting_date, supplier", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC", + "timeline_field": "supplier", + "title_field": "title", + "track_changes": 1, "track_seen": 0 } \ No newline at end of file From 1b4894c33ae4ce06176bcb6c203d5c4fd6e7bfe0 Mon Sep 17 00:00:00 2001 From: Zarrar Date: Fri, 17 Nov 2017 14:32:12 +0530 Subject: [PATCH 134/164] make root_type null if not root (#11626) --- erpnext/accounts/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index cd940ab584f..d592816692f 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -257,6 +257,8 @@ def add_ac(args=None): if cint(ac.get("is_root")): ac.parent_account = None ac.flags.ignore_mandatory = True + else: + ac.root_type = None ac.insert() From 11ec2c50e0229713e597001baf3b0e9dfa01675c Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 17 Nov 2017 14:49:46 +0530 Subject: [PATCH 135/164] [fix] set default language in local --- .../v9_2/rename_translated_domains_in_en.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/erpnext/patches/v9_2/rename_translated_domains_in_en.py b/erpnext/patches/v9_2/rename_translated_domains_in_en.py index 88ffbb7a3d3..168605d9a54 100644 --- a/erpnext/patches/v9_2/rename_translated_domains_in_en.py +++ b/erpnext/patches/v9_2/rename_translated_domains_in_en.py @@ -4,7 +4,9 @@ from frappe import _ def execute(): language = frappe.get_single("System Settings").language - if language.startswith('en'): return + if language and language.startswith('en'): return + + frappe.local.lang = language all_domains = frappe.get_hooks("domains") @@ -16,11 +18,14 @@ def execute(): domain_settings = frappe.get_single("Domain Settings") active_domains = [d.domain for d in domain_settings.active_domains] - for domain in active_domains: - domain = frappe.get_doc("Domain", domain) - domain.setup_domain() + try: + for domain in active_domains: + domain = frappe.get_doc("Domain", domain) + domain.setup_domain() - if int(frappe.db.get_single_value('System Settings', 'setup_complete')): - domain.setup_sidebar_items() - domain.setup_desktop_icons() - domain.set_default_portal_role() + if int(frappe.db.get_single_value('System Settings', 'setup_complete')): + domain.setup_sidebar_items() + domain.setup_desktop_icons() + domain.set_default_portal_role() + except frappe.LinkValidationError: + pass \ No newline at end of file From f773af6053c201ef79e0681fd05aa4a2ccb3ccb1 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 17 Nov 2017 15:25:23 +0600 Subject: [PATCH 136/164] bumped to version 9.2.15 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index d1e9417db14..30b021e0904 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '9.2.14' +__version__ = '9.2.15' def get_default_company(user=None): '''Get default company for user''' From 83587c72f649078e0da40a4315d5f46674d821f2 Mon Sep 17 00:00:00 2001 From: pratu16x7 Date: Fri, 17 Nov 2017 15:33:12 +0530 Subject: [PATCH 137/164] [minor] fix plurals spacing --- erpnext/stock/doctype/item/item.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index f670e946cda..aed6f41040c 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -344,8 +344,7 @@ $.extend(erpnext.item, { let no_of_combinations = lengths.reduce((a, b) => a * b, 1); me.multiple_variant_dialog.get_primary_btn() .html(__( - `Make ${no_of_combinations} Variant - ${no_of_combinations === 1 ? '' : 's'}` + `Make ${no_of_combinations} Variant${no_of_combinations === 1 ? '' : 's'}` )); me.multiple_variant_dialog.enable_primary_action(); } From a8823eadb602aa4ccfe7dc5666e11cef32ff9859 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Thu, 9 Nov 2017 17:07:43 +0530 Subject: [PATCH 138/164] [travis] run patches by restoring v7 database --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 8681c03f55d..4182a123868 100644 --- a/.travis.yml +++ b/.travis.yml @@ -64,4 +64,10 @@ jobs: - bench execute erpnext.setup.utils.enable_all_roles_and_domains - bench run-ui-tests --app erpnext env: Client Side Test + - # stage + script: + - wget http://build.erpnext.com/20171108_190013_955977f8_database.sql.gz + - bench --force restore ~/frappe-bench/20171108_190013_955977f8_database.sql.gz --mariadb-root-password travis + - bench migrate + env: Patch Testing From 00e82cdab3f698ecf81d5a7f102a14396764bc60 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 17 Nov 2017 19:06:08 +0530 Subject: [PATCH 139/164] [fix] patch fixes to setup patch tester on travis --- erpnext/patches.txt | 1 + .../patches/v9_0/add_user_to_child_table_in_pos_profile.py | 7 ++++++- .../patches/v9_0/student_admission_childtable_migrate.py | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index bc63f4a794e..25a164071c4 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -334,6 +334,7 @@ execute:frappe.reload_doctype('Employee') #2016-10-18 execute:frappe.db.sql("update `tabEmployee` set prefered_contact_email = IFNULL(prefered_contact_email,'') ") execute:frappe.reload_doctype("Salary Slip") execute:frappe.db.sql("update `tabSalary Slip` set posting_date=creation") +execute:frappe.reload_doc("stock", "doctype", "stock_settings") erpnext.patches.v8_0.create_domain_docs #16-05-2017 erpnext.patches.v7_1.update_portal_roles erpnext.patches.v7_1.set_total_amount_currency_in_je diff --git a/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py b/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py index e7833c0f5c5..c150cfa3e2d 100644 --- a/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py +++ b/erpnext/patches/v9_0/add_user_to_child_table_in_pos_profile.py @@ -7,7 +7,9 @@ import frappe def execute(): doctype = 'POS Profile' frappe.reload_doc('accounts', 'doctype', doctype) - frappe.reload_doc('accounts', 'doctype', 'POS Profile User') + frappe.reload_doc('accounts', 'doctype', 'pos_profile_user') + frappe.reload_doc('accounts', 'doctype', 'pos_item_group') + frappe.reload_doc('accounts', 'doctype', 'pos_customer_group') for doc in frappe.get_all(doctype): _doc = frappe.get_doc(doctype, doc.name) @@ -19,4 +21,7 @@ def execute(): 'user': user }) _doc.pos_profile_name = user + ' - ' + _doc.company + _doc.flags.ignore_validate = True + _doc.flags.ignore_mandatory = True _doc.save() + diff --git a/erpnext/patches/v9_0/student_admission_childtable_migrate.py b/erpnext/patches/v9_0/student_admission_childtable_migrate.py index dcbbeebcaf7..76b946d6375 100644 --- a/erpnext/patches/v9_0/student_admission_childtable_migrate.py +++ b/erpnext/patches/v9_0/student_admission_childtable_migrate.py @@ -5,8 +5,8 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doc('schools', 'doctype', 'Student Admission Program') - frappe.reload_doctype('Student Admission') + frappe.reload_doc('schools', 'doctype', 'student_admission_program') + frappe.reload_doc('schools', 'doctype', 'student_admission') if "program" not in frappe.db.get_table_columns("Student Admission"): return From 0fe455a9919b736269ee7923f0d6810a607de021 Mon Sep 17 00:00:00 2001 From: KanchanChauhan Date: Fri, 17 Nov 2017 20:08:15 +0530 Subject: [PATCH 140/164] [Minor][Bug] Fix syntax error (#11633) --- erpnext/public/js/controllers/transaction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index f53013773e0..621e9a749e8 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1149,7 +1149,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ } if (item.warehouse) filters["warehouse"] = item.warehouse; - return s + return { query : "erpnext.controllers.queries.get_batch_no", filters: filters } From e1b862931359b953dcc225bce0cd5cfb0f17d514 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Fri, 17 Nov 2017 20:08:45 +0530 Subject: [PATCH 141/164] Fix setup wiz test (#11640) * increase timeout in setup wiz test * enable profile slide --- erpnext/setup/setup_wizard/test_setup_wizard.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/erpnext/setup/setup_wizard/test_setup_wizard.py b/erpnext/setup/setup_wizard/test_setup_wizard.py index 313039b2a85..5e2a3034f8b 100644 --- a/erpnext/setup/setup_wizard/test_setup_wizard.py +++ b/erpnext/setup/setup_wizard/test_setup_wizard.py @@ -30,16 +30,17 @@ def run_setup_wizard_test(): time.sleep(1) driver.click(".next-btn") - # # Profile slide - # driver.set_field("full_name", "Great Tester") - # driver.set_field("email", "great@example.com") - # driver.set_field("password", "test") - # driver.wait_for_ajax(True) - # time.sleep(1) - # driver.click(".next-btn") - # time.sleep(1) + # Profile slide + driver.set_field("full_name", "Great Tester") + driver.set_field("email", "great@example.com") + driver.set_field("password", "test") + driver.wait_for_ajax(True) + time.sleep(1) + driver.click(".next-btn") + time.sleep(1) # domain slide + # time.sleep(3) driver.set_select("domain", "Manufacturing") time.sleep(1) driver.click(".next-btn") From 77940493a828e80a87bd0ec92ddf1b177d7b3aee Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 18 Nov 2017 16:58:58 +0530 Subject: [PATCH 142/164] [fix] Price list not loaded from pos profile, auto set outstanding amount in the mode of payment --- .../doctype/pos_profile/pos_profile.js | 4 +- .../doctype/sales_invoice/sales_invoice.py | 2 +- .../page/point_of_sale/point_of_sale.js | 60 +++++++++++++------ 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.js b/erpnext/accounts/doctype/pos_profile/pos_profile.js index cb52627cf0d..25aff13693b 100755 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.js +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.js @@ -24,11 +24,11 @@ frappe.ui.form.on("POS Profile", "onload", function(frm) { frappe.ui.form.on('POS Profile', { setup: function(frm) { - frm.set_query("online_print_format", function() { + frm.set_query("print_format_for_online", function() { return { filters: [ ['Print Format', 'doc_type', '=', 'Sales Invoice'], - ['Print Format', 'print_format_type', '!=', 'Js'], + ['Print Format', 'print_format_type', '=', 'Server'], ] }; }); diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index db9969d133e..83d51030207 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -247,7 +247,7 @@ class SalesInvoice(SellingController): super(SalesInvoice, self).set_missing_values(for_validate) if pos: - return {"print_format": pos.get("print_format") } + return {"print_format": pos.get("print_format_for_online") } 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 b167bcda6cc..0a70bb905aa 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.js +++ b/erpnext/selling/page/point_of_sale/point_of_sale.js @@ -53,8 +53,6 @@ erpnext.pos.PointOfSale = class PointOfSale { () => this.setup_pos_profile(), () => this.make_new_invoice(), () => { - frappe.timeout(1); - this.make_items(); this.bind_events(); frappe.dom.unfreeze(); }, @@ -323,16 +321,20 @@ erpnext.pos.PointOfSale = class PointOfSale { make_new_invoice() { return frappe.run_serially([ - () => this.make_sales_invoice_frm(), () => { - if (this.cart) { - this.cart.frm = this.frm; - this.cart.reset(); - } else { - this.make_cart(); - } - this.toggle_editing(true); - } + this.make_sales_invoice_frm() + .then(() => this.set_pos_profile_data()) + .then(() => { + if (this.cart) { + this.cart.frm = this.frm; + this.cart.reset(); + } else { + this.make_items(); + this.make_cart(); + } + this.toggle_editing(true); + }) + }, ]); } @@ -359,12 +361,29 @@ erpnext.pos.PointOfSale = class PointOfSale { if(!frm.doc.company) { frm.set_value('company', pos_profile.company); } - frm.set_value('is_pos', 1); - frm.meta.default_print_format = 'POS Invoice'; + frm.doc.is_pos = 1; return frm; } } + set_pos_profile_data() { + return new Promise(resolve => { + return this.frm.call({ + doc: this.frm.doc, + method: "set_missing_values", + }).then((r) => { + if(!r.exc) { + this.frm.script_manager.trigger("update_stock"); + frappe.model.set_default_values(this.frm.doc); + this.frm.cscript.calculate_taxes_and_totals(); + this.frm.meta.default_print_format = r.message.print_format || 'POS Invoice'; + } + + resolve(); + }) + }) + } + prepare_menu() { var me = this; this.page.clear_menu(); @@ -392,9 +411,6 @@ erpnext.pos.PointOfSale = class PointOfSale { if(this.frm.doc.docstatus !== 1) return; this.page.set_secondary_action(__("Print"), () => { - if (this.pos_profile && this.pos_profile.print_format_for_online) { - this.frm.meta.default_print_format = this.pos_profile.print_format_for_online; - } this.frm.print_preview.printit(true); }); @@ -1264,6 +1280,16 @@ class Payment { $(this.dialog.body).find('.input-with-feedback').focusin(function() { me.numpad.reset_value(); me.fieldname = $(this).prop('dataset').fieldname; + if (me.frm.doc.outstanding_amount > 0 && + !in_list(['write_off_amount', 'change_amount'], me.fieldname)) { + me.frm.doc.payments.forEach((data) => { + if (data.mode_of_payment == me.fieldname && !data.amount) { + me.dialog.set_value(me.fieldname, + me.frm.doc.outstanding_amount / me.frm.doc.conversion_rate); + return; + } + }) + } }); } @@ -1403,4 +1429,4 @@ class Payment { this.dialog.set_value("paid_amount", this.frm.doc.paid_amount); this.dialog.set_value("outstanding_amount", this.frm.doc.outstanding_amount); } -} +} \ No newline at end of file From 179e0c1d8da0b8eefaa2b51f545f2de818aa69c0 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 20 Nov 2017 11:18:55 +0530 Subject: [PATCH 143/164] Added party name in accounts receivable/payable report (#11656) --- .../accounts_receivable/accounts_receivable.html | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html index 8fafce67812..9d872a49f08 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html @@ -36,8 +36,14 @@
{%= data[i][__("Voucher No")] %} {% if(!(filters.customer || filters.supplier)) { %} - {%= data[i][__("Customer Name")] || data[i][__("Customer")] || data[i][__("Supplier Name")] || data[i][__("Supplier")] %}
{%= __("Remarks") %}: + {%= data[i][__("Customer")] || data[i][__("Supplier")] %} + {% if(data[i][__("Customer Name")] && data[i][__("Customer Name")] != data[i][__("Customer")]) { %} +
{%= data[i][__("Customer Name")] %} + {% } else if(data[i][__("Supplier Name")] != data[i][__("Supplier")]) { %} +
{%= data[i][__("Supplier Name")] %} + {% } %} {% } %} +
{%= __("Remarks") %}: {%= data[i][__("Remarks")] %} @@ -66,8 +72,13 @@ {% if(!(filters.customer || filters.supplier)) { %} {%= data[i][__("Customer")] || data[i][__("Supplier")] %} -
{%= __("Remarks") %}: + {% if(data[i][__("Customer Name")] && data[i][__("Customer Name")] != data[i][__("Customer")]) { %} +
{%= data[i][__("Customer Name")] %} + {% } else if(data[i][__("Supplier Name")] != data[i][__("Supplier")]) { %} +
{%= data[i][__("Supplier Name")] %} + {% } %} {% } %} +
{%= __("Remarks") %}: {%= data[i][__("Remarks")] %} {% } else { %} From 1484793055e28c81dfaa1206d05bf17d1de9b242 Mon Sep 17 00:00:00 2001 From: Britlog Date: Mon, 20 Nov 2017 06:52:18 +0100 Subject: [PATCH 144/164] Shopping cart addresses management (#11657) --- erpnext/shopping_cart/cart.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py index 7bc7874b2f7..f7a7d48422f 100644 --- a/erpnext/shopping_cart/cart.py +++ b/erpnext/shopping_cart/cart.py @@ -34,12 +34,15 @@ def get_cart_quotation(doc=None): addresses = get_address_docs(party=party) + if not doc.customer_address and addresses: + update_cart_address("customer_address", addresses[0].name) + return { "doc": decorate_quotation_doc(doc), "shipping_addresses": [{"name": address.name, "display": address.display} - for address in addresses if address.address_type == "Shipping"], + for address in addresses], "billing_addresses": [{"name": address.name, "display": address.display} - for address in addresses if address.address_type == "Billing"], + for address in addresses], "shipping_rules": get_applicable_shipping_rules(party) } @@ -47,9 +50,8 @@ def get_cart_quotation(doc=None): def place_order(): quotation = _get_cart_quotation() quotation.company = frappe.db.get_value("Shopping Cart Settings", None, "company") - for fieldname in ["customer_address", "shipping_address_name"]: - if not quotation.get(fieldname): - throw(_("{0} is required").format(quotation.meta.get_label(fieldname))) + if not quotation.get("customer_address"): + throw(_("{0} is required").format(_(quotation.meta.get_label("customer_address")))) quotation.flags.ignore_permissions = True quotation.submit() From 834541a7e8601857bd88f65452532af07a718d05 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 20 Nov 2017 11:31:53 +0530 Subject: [PATCH 145/164] [fix] Added primary action in the modal which will show on the submission in the pos (#11575) --- .../page/point_of_sale/point_of_sale.js | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) 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 c127e97ceea..c7732f65a98 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.js +++ b/erpnext/selling/page/point_of_sale/point_of_sale.js @@ -55,7 +55,7 @@ erpnext.pos.PointOfSale = class PointOfSale { () => { frappe.timeout(1); this.make_items(); - this.bind_events(); + this.set_pos_profile_data(); frappe.dom.unfreeze(); }, () => this.page.set_title(__('Point of Sale')) @@ -275,13 +275,30 @@ erpnext.pos.PointOfSale = class PointOfSale { this.toggle_editing(); this.set_form_action(); + this.set_primary_action_in_modal(); } }); }); } - bind_events() { + set_primary_action_in_modal() { + this.frm.msgbox = frappe.msgprint( + ` + ${__('Print')} + + ${__('New')}` + ); + $(this.frm.msgbox.body).find('.btn-default').on('click', () => { + this.frm.msgbox.hide(); + this.make_new_invoice(); + }) + } + + set_pos_profile_data() { + if (this.pos_profile && this.pos_profile.print_format_for_online) { + this.frm.meta.default_print_format = this.pos_profile.print_format_for_online; + } } setup_pos_profile() { @@ -370,6 +387,7 @@ erpnext.pos.PointOfSale = class PointOfSale { if (this.cart) { this.cart.frm = this.frm; this.cart.reset(); + this.items.reset_search_field(); } else { this.make_cart(); } @@ -434,9 +452,6 @@ erpnext.pos.PointOfSale = class PointOfSale { if(this.frm.doc.docstatus !== 1) return; this.page.set_secondary_action(__("Print"), () => { - if (this.pos_profile && this.pos_profile.print_format_for_online) { - this.frm.meta.default_print_format = this.pos_profile.print_format_for_online; - } this.frm.print_preview.printit(true); }); From cc884578b5f3e45551282ba3476c7732a5313be6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 21 Nov 2017 12:24:03 +0530 Subject: [PATCH 146/164] Update sales_order.py --- erpnext/selling/doctype/sales_order/sales_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 747a3c062c7..51e6c61ea3e 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -103,7 +103,7 @@ class SalesOrder(SellingController): def validate_delivery_date(self): if self.order_type == 'Sales': if not self.delivery_date: - self.delivery_date = max([d.delivery_date for d in self.get("items")]) + self.delivery_date = max([d.delivery_date for d in self.get("items") if d.delivery_date]) if self.delivery_date: for d in self.get("items"): From 5171da81a11ac7b21837424182034a65eceaa3b9 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 21 Nov 2017 15:18:47 +0530 Subject: [PATCH 147/164] [minor] fix-patch --- erpnext/patches/v9_1/create_issue_opportunity_type.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/patches/v9_1/create_issue_opportunity_type.py b/erpnext/patches/v9_1/create_issue_opportunity_type.py index 5b3819b956b..aa8bbd1e799 100644 --- a/erpnext/patches/v9_1/create_issue_opportunity_type.py +++ b/erpnext/patches/v9_1/create_issue_opportunity_type.py @@ -7,8 +7,8 @@ from frappe import _ def execute(): # delete custom field if exists - for fieldname in ('issue_type', 'opportunity_type'): - custom_field = frappe.db.get_value("Custom Field", {"fieldname": fieldname}) + for doctype, fieldname in (('Issue', 'issue_type'), ('Opportunity', 'opportunity_type')): + custom_field = frappe.db.get_value("Custom Field", {"fieldname": fieldname, 'dt': doctype}) if custom_field: frappe.delete_doc("Custom Field", custom_field, ignore_permissions=True) From d503f12713adfb93886cb4ba36104d3ef684fb71 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 21 Nov 2017 15:22:41 +0530 Subject: [PATCH 148/164] [fix] ui test-case path --- erpnext/tests/ui/tests.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index 3e40485d74d..35facc65675 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -1,7 +1,7 @@ erpnext/tests/ui/make_fixtures.js #long erpnext/setup/doctype/company/tests/test_company.js -erpnext/accounts/doctype/account/test_account.js -erpnext/accounts/doctype/account/test_make_tax_account.js +erpnext/accounts/doctype/account/tests/test_account.js +erpnext/accounts/doctype/account/tests/test_make_tax_account.js erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js From f71f3af938cabbfe088d9973c7d9a1af9ee7deb5 Mon Sep 17 00:00:00 2001 From: Zarrar Date: Tue, 21 Nov 2017 16:12:01 +0530 Subject: [PATCH 149/164] adding task to root node (#11666) --- erpnext/projects/doctype/task/task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index fa56a959602..52d9025669c 100644 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -233,7 +233,7 @@ def add_node(): }) args = make_tree_args(**args) - if args.parent_task == 'task': + if args.parent_task == 'All Tasks': args.parent_task = None frappe.get_doc(args).insert() From 75443a94ee05db66916aabced04af33bcf4f9a18 Mon Sep 17 00:00:00 2001 From: Makarand Bauskar Date: Tue, 21 Nov 2017 16:12:40 +0530 Subject: [PATCH 150/164] [minor] set the pos profile name while creating demo (#11664) --- erpnext/demo/setup/setup_data.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/demo/setup/setup_data.py b/erpnext/demo/setup/setup_data.py index 34e9a3e5725..d395493c470 100644 --- a/erpnext/demo/setup/setup_data.py +++ b/erpnext/demo/setup/setup_data.py @@ -348,8 +348,10 @@ def setup_budget(): budget.action_if_annual_budget_exceeded = "Warn" expense_ledger_count = frappe.db.count("Account", {"is_group": "0", "root_type": "Expense"}) - add_random_children(budget, "accounts", rows=random.randint(10, expense_ledger_count), randomize = { "account": ("Account", {"is_group": "0", "root_type": "Expense"}) - }, unique="account") + add_random_children(budget, "accounts", rows=random.randint(10, expense_ledger_count), + randomize = { + "account": ("Account", {"is_group": "0", "root_type": "Expense"}) + }, unique="account") for d in budget.accounts: d.budget_amount = random.randint(5, 100) * 10000 @@ -361,6 +363,7 @@ def setup_pos_profile(): company_abbr = frappe.db.get_value("Company", erpnext.get_default_company(), "abbr") pos = frappe.new_doc('POS Profile') pos.user = frappe.db.get_global('demo_accounts_user') + pos.pos_profile_name = "Demo POS Profile" pos.naming_series = 'SINV-' pos.update_stock = 0 pos.write_off_account = 'Cost of Goods Sold - '+ company_abbr From e8ccc0e942e60506384fa41e653b4aabb389a253 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Tue, 21 Nov 2017 16:17:22 +0530 Subject: [PATCH 151/164] [enhance] Added multi UOM feature in Material Request (#11352) * [enhance] Added multi UOM in Material Request * test cases * patch to update multi uom fields in material request item --- .../doctype/purchase_order/purchase_order.py | 2 +- erpnext/patches.txt | 1 + ...te_multi_uom_fields_in_material_request.py | 12 ++ erpnext/public/js/controllers/transaction.js | 5 +- .../material_request/material_request.py | 25 ++-- .../material_request/test_material_request.py | 45 +++++- .../material_request_item.json | 135 ++++++++++++++++-- erpnext/stock/get_item_details.py | 8 +- erpnext/stock/reorder_item.py | 14 +- 9 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index bbaa0432085..e767ae7df61 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -29,7 +29,7 @@ class PurchaseOrder(BuyingController): 'target_field': 'ordered_qty', 'target_parent_dt': 'Material Request', 'target_parent_field': 'per_ordered', - 'target_ref_field': 'qty', + 'target_ref_field': 'stock_qty', 'source_field': 'stock_qty', 'percent_join_field': 'material_request', 'overflow_type': 'order' diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 25a164071c4..cc42ae9fc9d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -466,3 +466,4 @@ erpnext.patches.v9_2.delete_healthcare_domain_default_items erpnext.patches.v9_1.create_issue_opportunity_type erpnext.patches.v9_2.rename_translated_domains_in_en erpnext.patches.v9_0.set_shipping_type_for_existing_shipping_rules +erpnext.patches.v9_0.update_multi_uom_fields_in_material_request \ No newline at end of file diff --git a/erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py b/erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py new file mode 100644 index 00000000000..45610ed5a73 --- /dev/null +++ b/erpnext/patches/v9_0/update_multi_uom_fields_in_material_request.py @@ -0,0 +1,12 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doctype('Material Request') + frappe.reload_doctype('Material Request Item') + + frappe.db.sql(""" update `tabMaterial Request Item` + set stock_uom = uom, stock_qty = qty, conversion_factor = 1.0""") \ No newline at end of file diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 621e9a749e8..f93d76ec787 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -650,7 +650,10 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ item.stock_qty = flt(item.qty * item.conversion_factor, precision("stock_qty", item)); refresh_field("stock_qty", item.name, item.parentfield); this.toggle_conversion_factor(item); - if(!dont_fetch_price_list_rate) this.apply_price_list(item, true); + if (!dont_fetch_price_list_rate && + frappe.meta.has_field(doc.doctype, "price_list_currency")) { + this.apply_price_list(item, true); + } } }, diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 59075c588b7..da310aa3d7a 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -158,7 +158,7 @@ class MaterialRequest(BuyingController): and material_request_item = %s and docstatus = 1""", (self.name, d.name))[0][0]) - if d.ordered_qty and d.ordered_qty > d.qty: + if d.ordered_qty and d.ordered_qty > d.stock_qty: frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1} \ cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code)) @@ -170,11 +170,12 @@ class MaterialRequest(BuyingController): frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty) + target_ref_field = 'qty' if self.material_request_type == "Manufacture" else 'stock_qty' self._update_percent_field({ "target_dt": "Material Request Item", "target_parent_dt": self.doctype, "target_parent_field": "per_ordered", - "target_ref_field": "qty", + "target_ref_field": target_ref_field, "target_field": "ordered_qty", "name": self.name, }, update_modified) @@ -216,9 +217,9 @@ def set_missing_values(source, target_doc): target_doc.run_method("calculate_taxes_and_totals") def update_item(obj, target, source_parent): - target.conversion_factor = 1 - target.qty = flt(obj.qty) - flt(obj.ordered_qty) - target.stock_qty = target.qty + target.conversion_factor = obj.conversion_factor + target.qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty))/ target.conversion_factor + target.stock_qty = (target.qty * target.conversion_factor) @frappe.whitelist() def make_purchase_order(source_name, target_doc=None): @@ -242,7 +243,7 @@ def make_purchase_order(source_name, target_doc=None): ["uom", "uom"] ], "postprocess": update_item, - "condition": lambda doc: doc.ordered_qty < doc.qty + "condition": lambda doc: doc.ordered_qty < doc.stock_qty } }, target_doc, postprocess) @@ -353,11 +354,11 @@ def make_supplier_quotation(source_name, target_doc=None): @frappe.whitelist() def make_stock_entry(source_name, target_doc=None): def update_item(obj, target, source_parent): - qty = flt(obj.qty) - flt(obj.ordered_qty) \ - if flt(obj.qty) > flt(obj.ordered_qty) else 0 + qty = flt(flt(obj.stock_qty) - flt(obj.ordered_qty))/ target.conversion_factor \ + if flt(obj.stock_qty) > flt(obj.ordered_qty) else 0 target.qty = qty - target.transfer_qty = qty - target.conversion_factor = 1 + target.transfer_qty = qty * obj.conversion_factor + target.conversion_factor = obj.conversion_factor if source_parent.material_request_type == "Material Transfer": target.t_warehouse = obj.warehouse @@ -384,7 +385,7 @@ def make_stock_entry(source_name, target_doc=None): "uom": "stock_uom", }, "postprocess": update_item, - "condition": lambda doc: doc.ordered_qty < doc.qty + "condition": lambda doc: doc.ordered_qty < doc.stock_qty } }, target_doc, set_missing_values) @@ -405,7 +406,7 @@ def raise_production_orders(material_request): prod_order.fg_warehouse = d.warehouse prod_order.wip_warehouse = default_wip_warehouse prod_order.description = d.description - prod_order.stock_uom = d.uom + prod_order.stock_uom = d.stock_uom prod_order.expected_delivery_date = d.schedule_date prod_order.sales_order = d.sales_order prod_order.bom_no = get_item_details(d.item_code).bom_no diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index a24957e2b07..83971d37796 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe, unittest, erpnext -from frappe.utils import flt +from frappe.utils import flt, today from erpnext.stock.doctype.material_request.material_request import raise_production_orders class TestMaterialRequest(unittest.TestCase): @@ -558,5 +558,48 @@ class TestMaterialRequest(unittest.TestCase): item_code= %s and warehouse= %s """, (mr.items[0].item_code, mr.items[0].warehouse))[0][0] self.assertEquals(requested_qty, new_requested_qty) + def test_multi_uom_for_purchase(self): + from erpnext.stock.doctype.material_request.material_request import make_purchase_order + + mr = frappe.copy_doc(test_records[0]) + mr.material_request_type = 'Purchase' + item = mr.items[0] + mr.schedule_date = today() + + if not frappe.db.get_value('UOM Conversion Detail', + {'parent': item.item_code, 'uom': 'Kg'}): + item_doc = frappe.get_doc('Item', item.item_code) + item_doc.append('uoms', { + 'uom': 'Kg', + 'conversion_factor': 5 + }) + item_doc.save(ignore_permissions=True) + + item.uom = 'Kg' + for item in mr.items: + item.schedule_date = mr.schedule_date + + mr.insert() + self.assertRaises(frappe.ValidationError, make_purchase_order, + mr.name) + + mr = frappe.get_doc("Material Request", mr.name) + mr.submit() + item = mr.items[0] + + self.assertEquals(item.uom, "Kg") + self.assertEquals(item.conversion_factor, 5.0) + self.assertEquals(item.stock_qty, flt(item.qty * 5)) + + po = make_purchase_order(mr.name) + self.assertEquals(po.doctype, "Purchase Order") + self.assertEquals(len(po.get("items")), len(mr.get("items"))) + + po.supplier = '_Test Supplier' + po.insert() + po.submit() + mr = frappe.get_doc("Material Request", mr.name) + self.assertEquals(mr.per_ordered, 100) + test_dependencies = ["Currency Exchange", "BOM"] test_records = frappe.get_test_records('Material Request') diff --git a/erpnext/stock/doctype/material_request_item/material_request_item.json b/erpnext/stock/doctype/material_request_item/material_request_item.json index 5bf3f27a1b4..3434b4d48f5 100644 --- a/erpnext/stock/doctype/material_request_item/material_request_item.json +++ b/erpnext/stock/doctype/material_request_item/material_request_item.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "hash", @@ -13,6 +14,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -46,6 +48,7 @@ "width": "100px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -73,6 +76,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -105,6 +109,7 @@ "width": "100px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -134,6 +139,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -166,6 +172,7 @@ "width": "250px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -194,6 +201,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -223,6 +231,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -251,6 +260,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -283,11 +293,12 @@ "width": "80px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "uom", + "fieldname": "stock_uom", "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, @@ -299,23 +310,21 @@ "label": "Stock UOM", "length": 0, "no_copy": 0, - "oldfieldname": "uom", - "oldfieldtype": "Link", "options": "UOM", "permlevel": 0, - "print_hide": 0, + "precision": "", + "print_hide": 1, "print_hide_if_no_value": 0, - "print_width": "70px", "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, "search_index": 0, "set_only_once": 0, - "unique": 0, - "width": "70px" + "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -349,6 +358,7 @@ "width": "100px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -376,6 +386,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 1, "collapsible": 0, @@ -409,6 +420,101 @@ "width": "100px" }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "uom", + "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": "UOM", + "length": 0, + "no_copy": 0, + "oldfieldname": "uom", + "oldfieldtype": "Link", + "options": "UOM", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "70px", + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "70px" + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "conversion_factor", + "fieldtype": "Float", + "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": "UOM Conversion Factor", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "stock_qty", + "fieldtype": "Float", + "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": "Stock Qty", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "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, @@ -437,6 +543,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -469,6 +576,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -502,6 +610,7 @@ "width": "100px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -532,6 +641,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -561,6 +671,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -591,6 +702,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -618,6 +730,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -650,6 +763,7 @@ "width": "70px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -682,6 +796,7 @@ "width": "70px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -711,6 +826,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -741,6 +857,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -771,17 +888,17 @@ "unique": 0 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-02-20 13:31:50.143583", + "modified": "2017-10-25 17:18:59.974778", "modified_by": "Administrator", "module": "Stock", "name": "Material Request Item", diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 539e8a56676..102d1688402 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -164,11 +164,17 @@ def get_basic_details(args, item): warehouse = user_default_warehouse or item.default_warehouse or args.warehouse + material_request_type = '' + if args.get('doctype') == "Material Request": + material_request_type = frappe.db.get_value('Material Request', + args.get('name'), 'material_request_type') + #Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master if not args.uom: if args.get('doctype') in ['Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice']: args.uom = item.sales_uom if item.sales_uom else item.stock_uom - elif args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']: + elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \ + (args.get('doctype') == 'Material Request' and material_request_type == 'Purchase'): args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom else: args.uom = item.stock_uom diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py index 46b8840538b..d4bc08b045f 100644 --- a/erpnext/stock/reorder_item.py +++ b/erpnext/stock/reorder_item.py @@ -128,16 +128,26 @@ def create_material_request(material_requests): for d in items: d = frappe._dict(d) item = frappe.get_doc("Item", d.item_code) + uom = item.stock_uom + conversion_factor = 1.0 + + if request_type == 'Purchase': + uom = item.purchase_uom or item.stock_uom + if uom != item.stock_uom: + conversion_factor = frappe.db.get_value("UOM Conversion Detail", + {'parent': item.name, 'uom': uom}, 'conversion_factor') or 1.0 + mr.append("items", { "doctype": "Material Request Item", "item_code": d.item_code, "schedule_date": add_days(nowdate(),cint(item.lead_time_days)), - "uom": item.stock_uom, + "qty": d.reorder_qty / conversion_factor, + "uom": uom, + "stock_uom": item.stock_uom, "warehouse": d.warehouse, "item_name": item.item_name, "description": item.description, "item_group": item.item_group, - "qty": d.reorder_qty, "brand": item.brand, }) From 26ca6afd118ef483ef4b3dcdcb04b1a1ec9e39cf Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 21 Nov 2017 16:16:38 +0530 Subject: [PATCH 152/164] [fix] test.txt for accounts --- erpnext/tests/ui/tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index 35facc65675..12af6e9036a 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -2,6 +2,7 @@ erpnext/tests/ui/make_fixtures.js #long erpnext/setup/doctype/company/tests/test_company.js erpnext/accounts/doctype/account/tests/test_account.js erpnext/accounts/doctype/account/tests/test_make_tax_account.js +erpnext/accounts/doctype/account/tests/test_make_with_number.js erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js From 476c66d699f9ffd102cbe8cdc6383c8089cbcf25 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 21 Nov 2017 17:02:39 +0530 Subject: [PATCH 153/164] [fix] tests.txt --- erpnext/tests/ui/tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index 12af6e9036a..0bbffa5666f 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -2,7 +2,7 @@ erpnext/tests/ui/make_fixtures.js #long erpnext/setup/doctype/company/tests/test_company.js erpnext/accounts/doctype/account/tests/test_account.js erpnext/accounts/doctype/account/tests/test_make_tax_account.js -erpnext/accounts/doctype/account/tests/test_make_with_number.js +erpnext/accounts/doctype/account/tests/test_account_with_number.js erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js From 6ca6a690708ef487e3a923ce328f52113f69744f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 21 Nov 2017 17:28:51 +0530 Subject: [PATCH 154/164] Course Scheduling Tool (#11676) * [education] Fix Course Scheduling Tool * minor --- .../course_scheduling_tool.js | 43 +++++--- .../course_scheduling_tool.json | 6 +- .../course_scheduling_tool.py | 99 +++++++++++-------- 3 files changed, 90 insertions(+), 58 deletions(-) diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js index f92f738ffdf..20503f919cc 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js +++ b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js @@ -1,20 +1,39 @@ // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -cur_frm.add_fetch("student_group", "program", "program"); -cur_frm.add_fetch("student_group", "course", "course"); -cur_frm.add_fetch("student_group", "academic_year", "academic_year"); -cur_frm.add_fetch("student_group", "academic_term", "academic_term"); -frappe.ui.form.on("Course Scheduling Tool", { - - refresh: function(frm) { +frappe.ui.form.on('Course Scheduling Tool', { + setup(frm) { + frm.add_fetch('student_group', 'program', 'program'); + frm.add_fetch('student_group', 'course', 'course'); + frm.add_fetch('student_group', 'academic_year', 'academic_year'); + frm.add_fetch('student_group', 'academic_term', 'academic_term'); + }, + refresh(frm) { frm.disable_save(); - frm.page.set_primary_action(__("Schedule Course"), function() { - frappe.call({ - method: "schedule_course", - doc: frm.doc - }) + frm.page.set_primary_action(__('Schedule Course'), () => { + frm.call('schedule_course') + .then(r => { + if (!r.message) { + frappe.throw(__('There were errors creating Course Schedule')); + } + const { course_schedules } = r.message; + if (course_schedules) { + const html = ` + + + + + ${course_schedules.map( + c => ` + ` + ).join('')} + +
${__('Following course schedules were created')}
${__("Course")}${__("Date")}
${c.name}${c.schedule_date}
` + + frappe.msgprint(html); + } + }); }); } }); \ No newline at end of file diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json index e0fc1e215e6..9bb99d75a13 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json +++ b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json @@ -476,7 +476,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "rechedule", + "fieldname": "reschedule", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -485,7 +485,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Rechedule", + "label": "Reschedule", "length": 0, "no_copy": 0, "permlevel": 0, @@ -602,7 +602,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:47.696063", + "modified": "2017-11-21 16:47:58.091740", "modified_by": "Administrator", "module": "Schools", "name": "Course Scheduling Tool", diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py index 4e079221ff4..647d34b65e2 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py +++ b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py @@ -10,71 +10,85 @@ from frappe.model.document import Document from frappe.utils import add_days, getdate from erpnext.schools.utils import OverlapError + class CourseSchedulingTool(Document): + def schedule_course(self): - """Creates course schedules as per specified parametes""" - - course_schedules= [] - course_schedules_errors= [] - rescheduled= [] - reschedule_errors= [] - + """Creates course schedules as per specified parameters""" + + course_schedules = [] + course_schedules_errors = [] + rescheduled = [] + reschedule_errors = [] + self.validate_mandatory() self.validate_date() - self.instructor_name= frappe.db.get_value("Instructor", self.instructor, "instructor_name") + self.instructor_name = frappe.db.get_value( + "Instructor", self.instructor, "instructor_name") + + group_based_on, course = frappe.db.get_value( + "Student Group", self.student_group, ["group_based_on", "course"]) - group_based_on, course = frappe.db.get_value("Student Group", self.student_group, ["group_based_on", "course"]) if group_based_on == "Course": - self.course = course + self.course = course + + if self.reschedule: + rescheduled, reschedule_errors = self.delete_course_schedule( + rescheduled, reschedule_errors) - if self.rechedule: - rescheduled, reschedule_errors = self.delete_course_schedule(rescheduled, reschedule_errors) - date = self.course_start_date - while(date < self.course_end_date): + while date < self.course_end_date: if self.day == calendar.day_name[getdate(date).weekday()]: course_schedule = self.make_course_schedule(date) try: + print('pass') course_schedule.save() except OverlapError: + print('fail') course_schedules_errors.append(date) else: - course_schedules.append(course_schedule.name + " on " + date) - + course_schedules.append(course_schedule) + date = add_days(date, 7) else: date = add_days(date, 1) - - frappe.local.message_log = [] - if course_schedules: - frappe.msgprint(_("Course Schedules created:") + "\n" + "\n".join(course_schedules)) - if course_schedules_errors: - frappe.msgprint(_("There were errors while scheduling course on :") + "\n" + "\n".join(course_schedules_errors)) - if rescheduled: - frappe.msgprint(_("Course Schedules deleted:") + "\n" + "\n".join(rescheduled)) - if reschedule_errors: - frappe.msgprint(_("There were errors while deleting following schedules:") + "\n" + "\n".join(reschedule_errors)) - + + return dict( + course_schedules=course_schedules, + course_schedules_errors=course_schedules_errors, + rescheduled=rescheduled, + reschedule_errors=reschedule_errors + ) + def validate_mandatory(self): """Validates all mandatory fields""" - - fields = ['course', 'room', 'instructor', 'from_time', 'to_time', 'course_start_date', 'course_end_date', 'day'] - for d in fields: + + fields = ['course', 'room', 'instructor', 'from_time', + 'to_time', 'course_start_date', 'course_end_date', 'day'] + for d in fields: if not self.get(d): - frappe.throw(_("{0} is mandatory").format(self.meta.get_label(d))) + frappe.throw(_("{0} is mandatory").format( + self.meta.get_label(d))) def validate_date(self): """Validates if Course Start Date is greater than Course End Date""" if self.course_start_date > self.course_end_date: - frappe.throw("Course Start Date cannot be greater than Course End Date.") + frappe.throw( + "Course Start Date cannot be greater than Course End Date.") def delete_course_schedule(self, rescheduled, reschedule_errors): """Delete all course schedule within the Date range and specified filters""" - schedules = frappe.get_list("Course Schedule", fields=["name", "schedule_date"], filters = - [["student_group", "=", self.student_group], - ["course", "=", self.course], - ["schedule_date", ">=", self.course_start_date], - ["schedule_date", "<=", self.course_end_date]]) + + schedules = frappe.get_list("Course Schedule", + fields=["name", "schedule_date"], + filters=[ + ["student_group", "=", self.student_group], + ["course", "=", self.course], + ["schedule_date", ">=", self.course_start_date], + ["schedule_date", "<=", self.course_end_date] + ] + ) + for d in schedules: try: if self.day == calendar.day_name[getdate(d.schedule_date).weekday()]: @@ -83,19 +97,18 @@ class CourseSchedulingTool(Document): except: reschedule_errors.append(d.name) return rescheduled, reschedule_errors - + def make_course_schedule(self, date): """Makes a new Course Schedule. :param date: Date on which Course Schedule will be created.""" - + course_schedule = frappe.new_doc("Course Schedule") course_schedule.student_group = self.student_group course_schedule.course = self.course course_schedule.instructor = self.instructor course_schedule.instructor_name = self.instructor_name course_schedule.room = self.room - course_schedule.schedule_date= date - course_schedule.from_time= self.from_time - course_schedule.to_time= self.to_time + course_schedule.schedule_date = date + course_schedule.from_time = self.from_time + course_schedule.to_time = self.to_time return course_schedule - \ No newline at end of file From 657ceef10595a0ff2a657e5e243a15e4324e87ee Mon Sep 17 00:00:00 2001 From: Zarrar Date: Tue, 21 Nov 2017 17:40:22 +0530 Subject: [PATCH 155/164] skipped tax_account (#11678) --- erpnext/setup/setup_wizard/setup_wizard.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 28e617faf75..ec70c39c2f1 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -254,7 +254,9 @@ def make_tax_account_and_template(company, account_name, tax_rate, template_name accounts = [] for i, name in enumerate(account_name): - accounts.append(make_tax_account(company, account_name[i], tax_rate[i])) + tax_account = make_tax_account(company, account_name[i], tax_rate[i]) + if tax_account: + accounts.append(tax_account) if accounts: make_sales_and_purchase_tax_templates(accounts, template_name) From 0551f7bb008bdbedec324a724d5df12a28f2759d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 21 Nov 2017 19:58:16 +0530 Subject: [PATCH 156/164] Cleanup and fixes of payment terms feature --- .../doctype/payment_entry/payment_entry.py | 65 +++++++------- .../payment_schedule/payment_schedule.json | 6 +- .../purchase_invoice/test_purchase_invoice.py | 14 ++-- .../sales_invoice/test_sales_invoice.py | 2 +- erpnext/accounts/party.py | 3 +- erpnext/controllers/accounts_controller.py | 81 +++++++++--------- erpnext/patches.txt | 4 - erpnext/patches/v8_10/add_due_date_to_gle.py | 7 -- .../add_payment_terms_field_to_supplier.py | 9 -- ...dd_payment_terms_field_to_supplier_type.py | 7 -- .../change_default_customer_credit_days.py | 84 ++++++++----------- ...hange_default_supplier_type_credit_days.py | 39 --------- .../v8_10/update_gl_due_date_for_pi_and_si.py | 2 + erpnext/public/js/controllers/transaction.js | 4 +- 14 files changed, 131 insertions(+), 196 deletions(-) delete mode 100644 erpnext/patches/v8_10/add_due_date_to_gle.py delete mode 100644 erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py delete mode 100644 erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py delete mode 100644 erpnext/patches/v8_10/change_default_supplier_type_credit_days.py diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 929e1cdd562..36ff0ac381b 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -505,12 +505,10 @@ def get_outstanding_reference_documents(args): company_currency = frappe.db.get_value("Company", args.get("company"), "default_currency") # Get negative outstanding sales /purchase invoices - total_field = "base_grand_total" if party_account_currency == company_currency else "grand_total" - negative_outstanding_invoices = [] - if (args.get("party_type") != "Student"): + if args.get("party_type") not in ["Student", "Employee"]: negative_outstanding_invoices = get_negative_outstanding_invoices(args.get("party_type"), - args.get("party"), args.get("party_account"), total_field) + args.get("party"), args.get("party_account"), party_account_currency, company_currency) # Get positive outstanding sales /purchase invoices/ Fees outstanding_invoices = get_outstanding_invoices(args.get("party_type"), args.get("party"), @@ -580,28 +578,34 @@ def get_orders_to_be_billed(posting_date, party_type, party, party_account_curre return order_list -def get_negative_outstanding_invoices(party_type, party, party_account, total_field): - if party_type != "Employee": - voucher_type = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice" - return frappe.db.sql(""" - select - "{voucher_type}" as voucher_type, name as voucher_no, - {total_field} as invoice_amount, outstanding_amount, posting_date, - due_date, conversion_rate as exchange_rate - from - `tab{voucher_type}` - where - {party_type} = %s and {party_account} = %s and docstatus = 1 and outstanding_amount < 0 - order by - posting_date, name - """.format(**{ - "total_field": total_field, - "voucher_type": voucher_type, - "party_type": scrub(party_type), - "party_account": "debit_to" if party_type == "Customer" else "credit_to" - }), (party, party_account), as_dict=True) +def get_negative_outstanding_invoices(party_type, party, party_account, party_account_currency, company_currency): + voucher_type = "Sales Invoice" if party_type == "Customer" else "Purchase Invoice" + if party_account_currency == company_currency: + grand_total_field = "base_grand_total" + rounded_total_field = "base_rounded_total" else: - return [] + grand_total_field = "grand_total" + rounded_total_field = "rounded_total" + + return frappe.db.sql(""" + select + "{voucher_type}" as voucher_type, name as voucher_no, + if({rounded_total_field}, {rounded_total_field}, {grand_total_field}) as invoice_amount, + outstanding_amount, posting_date, + due_date, conversion_rate as exchange_rate + from + `tab{voucher_type}` + where + {party_type} = %s and {party_account} = %s and docstatus = 1 and outstanding_amount < 0 + order by + posting_date, name + """.format(**{ + "rounded_total_field": rounded_total_field, + "grand_total_field": grand_total_field, + "voucher_type": voucher_type, + "party_type": scrub(party_type), + "party_account": "debit_to" if party_type == "Customer" else "credit_to" + }), (party, party_account), as_dict=True) @frappe.whitelist() def get_party_details(company, party_type, party, date): @@ -721,7 +725,10 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= if party_amount: grand_total = outstanding_amount = party_amount elif dt in ("Sales Invoice", "Purchase Invoice"): - grand_total = doc.base_grand_total if party_account_currency == doc.company_currency else doc.grand_total + if party_account_currency == doc.company_currency: + grand_total = doc.base_rounded_total or doc.base_grand_total + else: + grand_total = doc.rounded_total or doc.grand_total outstanding_amount = doc.outstanding_amount elif dt in ("Expense Claim"): grand_total = doc.total_sanctioned_amount @@ -730,8 +737,10 @@ def get_payment_entry(dt, dn, party_amount=None, bank_account=None, bank_amount= grand_total = doc.grand_total outstanding_amount = doc.outstanding_amount else: - total_field = "base_grand_total" if party_account_currency == doc.company_currency else "grand_total" - grand_total = flt(doc.get(total_field)) + if party_account_currency == doc.company_currency: + grand_total = flt(doc.get("base_rounded_total") or doc.base_grand_total) + else: + grand_total = flt(doc.get("rounded_total") or doc.grand_total) outstanding_amount = grand_total - flt(doc.advance_paid) # bank or cash diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json index b068f216ce1..b34f894538c 100644 --- a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json +++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json @@ -93,7 +93,7 @@ "label": "Due Date", "length": 0, "no_copy": 0, - "options": "payment_term.due_date", + "options": "", "permlevel": 0, "precision": "", "print_hide": 0, @@ -129,7 +129,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 1, + "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -179,7 +179,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-09-26 05:13:54.187475", + "modified": "2017-11-21 19:23:08.490659", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Schedule", diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 22a253587a9..a8298960ee4 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -255,6 +255,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(pi.outstanding_amount, 1212.30) pi.disable_rounded_total = 0 + pi.get("payment_schedule")[0].payment_amount = 1512.0 pi.save() self.assertEqual(pi.outstanding_amount, 1212.0) @@ -279,7 +280,7 @@ class TestPurchaseInvoice(unittest.TestCase): jv.submit() pi = frappe.copy_doc(test_records[0]) - + pi.disable_rounded_total = 1 pi.append("advances", { "reference_type": "Journal Entry", "reference_name": jv.name, @@ -290,9 +291,10 @@ class TestPurchaseInvoice(unittest.TestCase): }) pi.insert() - pi.update( - {"payment_schedule": get_payment_terms("_Test Payment Term Template", pi.posting_date, pi.grand_total)} - ) + pi.update({ + "payment_schedule": get_payment_terms("_Test Payment Term Template", + pi.posting_date, pi.grand_total) + }) pi.save() pi.submit() @@ -619,7 +621,7 @@ class TestPurchaseInvoice(unittest.TestCase): "invoice_portion": 40.00 }) pi.append("payment_schedule", { - "due_date": add_days(nowdate(), 45), + "due_date": add_days(nowdate(), 25), "payment_amount": 150, "invoice_portion": 60.00 }) @@ -634,7 +636,7 @@ class TestPurchaseInvoice(unittest.TestCase): expected_gl_entries = sorted([ [pi.credit_to, 0.0, 100.0, add_days(nowdate(), 15)], - [pi.credit_to, 0.0, 150.0, add_days(nowdate(), 45)], + [pi.credit_to, 0.0, 150.0, add_days(nowdate(), 25)], ["_Test Account Cost for Goods Sold - _TC", 250.0, 0.0, None] ]) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index f00e60ea984..2c851721e95 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -64,7 +64,7 @@ class TestSalesInvoice(unittest.TestCase): si.insert() self.assertTrue(si.payment_schedule) - self.assertEqual(si.payment_schedule[0].due_date, si.due_date) + self.assertEqual(getdate(si.payment_schedule[0].due_date), getdate(si.due_date)) def test_sales_invoice_calculation_base_currency(self): si = frappe.copy_doc(test_records[2]) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 5af63eb1939..7bccfe89f36 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -320,7 +320,8 @@ def validate_due_date(posting_date, due_date, party_type, party): msgprint(_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)") .format(date_diff(due_date, default_due_date))) else: - frappe.throw(_("Due / Reference Date cannot be after {0}").format(formatdate(default_due_date))) + frappe.throw(_("Due / Reference Date cannot be after {0}") + .format(formatdate(default_due_date))) @frappe.whitelist() def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_type=None, diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index a352e4c660c..fa8e356c4e2 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -26,9 +26,12 @@ class AccountsController(TransactionBase): return self.__company_currency def onload(self): - self.get("__onload").make_payment_via_journal_entry = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry') + self.get("__onload").make_payment_via_journal_entry \ + = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry') + if self.is_new(): - relevant_docs = ("Quotation", "Purchase Order", "Sales Order", "Purchase Invoice", "Purchase Order") + relevant_docs = ("Quotation", "Purchase Order", "Sales Order", + "Purchase Invoice", "Sales Invoice") if self.doctype in relevant_docs: self.set_payment_schedule() @@ -59,21 +62,18 @@ class AccountsController(TransactionBase): self.validate_paid_amount() def validate_invoice_documents_schedule(self): - if self.get("payment_schedule"): - self.set_due_date() - self.validate_payment_schedule() - else: - self.set_payment_schedule() - self.set_due_date() + self.validate_payment_schedule_dates() + self.set_due_date() + self.validate_invoice_portion() + self.set_payment_schedule() + self.validate_payment_schedule_amount() self.validate_due_date() self.validate_advance_entries() def validate_non_invoice_documents_schedule(self): - if self.get("payment_schedule"): - self.validate_invoice_portion() - self.validate_payment_schedule_amount() - else: - self.set_payment_schedule() + self.validate_invoice_portion() + self.set_payment_schedule() + self.validate_payment_schedule_amount() def validate_all_documents_schedule(self): if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.is_return: @@ -628,22 +628,24 @@ class AccountsController(TransactionBase): posting_date = self.get("posting_date") or self.get("transaction_date") date = self.get("due_date") due_date = date or posting_date + grand_total = self.get("rounded_total") or self.grand_total - if self.get("payment_terms_template") and not self.get("payment_schedule"): - data = get_payment_terms(self.payment_terms_template, posting_date, self.grand_total) - for item in data: - self.append("payment_schedule", item) - elif not self.get("payment_schedule"): - data = dict(due_date=due_date, invoice_portion=100, payment_amount=self.grand_total) - self.append("payment_schedule", data) + if not self.get("payment_schedule"): + if self.get("payment_terms_template"): + data = get_payment_terms(self.payment_terms_template, posting_date, grand_total) + for item in data: + self.append("payment_schedule", item) + else: + data = dict(due_date=due_date, invoice_portion=100, payment_amount=grand_total) + self.append("payment_schedule", data) + else: + for d in self.get("payment_schedule"): + d.payment_amount = grand_total * flt(d.invoice_portion) / 100 def set_due_date(self): - self.due_date = max([d.due_date for d in self.get("payment_schedule")]) - - def validate_payment_schedule(self): - self.validate_payment_schedule_dates() - self.validate_invoice_portion() - self.validate_payment_schedule_amount() + due_dates = [d.due_date for d in self.get("payment_schedule") if d.due_date] + if due_dates: + self.due_date = max(due_dates) def validate_payment_schedule_dates(self): dates = [] @@ -661,24 +663,27 @@ class AccountsController(TransactionBase): if li: duplicates = '
' + '
'.join(li) - frappe.throw(_("Rows with duplicate due dates in other rows were found: {list}").format(list=duplicates)) - + frappe.throw(_("Rows with duplicate due dates in other rows were found: {list}") + .format(list=duplicates)) def validate_payment_schedule_amount(self): - total = 0 - for d in self.get("payment_schedule"): - total += flt(d.payment_amount) + if self.get("payment_schedule"): + total = 0 + for d in self.get("payment_schedule"): + total += flt(d.payment_amount) - if total != self.grand_total: - frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand Total")) + grand_total = self.get("rounded_total") or self.grand_total + if total != grand_total: + frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total")) def validate_invoice_portion(self): - total_portion = 0 - for term in self.payment_schedule: - total_portion += flt(term.get('invoice_portion', 0)) + if self.get("payment_schedule"): + total_portion = 0 + for term in self.payment_schedule: + total_portion += flt(term.get('invoice_portion', 0)) - if flt(total_portion, 2) != 100.00: - frappe.msgprint(_('Combined invoice portion must equal 100%'), raise_exception=1, indicator='red') + if flt(total_portion, 2) != 100.00: + frappe.throw(_('Combined invoice portion must equal 100%'), indicator='red') def is_rounded_total_disabled(self): if self.meta.get_field("disable_rounded_total"): diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 923b25d967e..04dfe9fd700 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -460,12 +460,8 @@ execute:frappe.delete_doc_if_exists("DocType", "Program Fee") erpnext.patches.v9_0.set_pos_profile_name erpnext.patches.v9_0.remove_non_existing_warehouse_from_stock_settings execute:frappe.delete_doc_if_exists("DocType", "Program Fee") -erpnext.patches.v8_10.add_due_date_to_gle erpnext.patches.v8_10.update_gl_due_date_for_pi_and_si -erpnext.patches.v8_10.add_payment_terms_field_to_supplier erpnext.patches.v8_10.change_default_customer_credit_days -erpnext.patches.v8_10.add_payment_terms_field_to_supplier_type -erpnext.patches.v8_10.change_default_supplier_type_credit_days erpnext.patches.v9_0.update_employee_loan_details erpnext.patches.v9_2.delete_healthcare_domain_default_items erpnext.patches.v9_1.create_issue_opportunity_type diff --git a/erpnext/patches/v8_10/add_due_date_to_gle.py b/erpnext/patches/v8_10/add_due_date_to_gle.py deleted file mode 100644 index ec5e003cb9c..00000000000 --- a/erpnext/patches/v8_10/add_due_date_to_gle.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - if not frappe.db.has_column("GL Entry", "due_date"): - frappe.db.sql("ALTER TABLE `tabGL Entry` ADD COLUMN `due_date` DATE NULL") diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py deleted file mode 100644 index b507b2aabb7..00000000000 --- a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - if not frappe.db.has_column("Customer", "payment_terms"): - frappe.db.sql("ALTER TABLE `tabCustomer` ADD COLUMN `payment_terms` VARCHAR(140) NULL") - if not frappe.db.has_column("Supplier", "payment_terms"): - frappe.db.sql("ALTER TABLE `tabSupplier` ADD COLUMN `payment_terms` VARCHAR(140) NULL") diff --git a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py b/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py deleted file mode 100644 index 78b8943092f..00000000000 --- a/erpnext/patches/v8_10/add_payment_terms_field_to_supplier_type.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals -import frappe - - -def execute(): - if not frappe.db.has_column("Supplier Type", "payment_terms"): - frappe.db.sql("ALTER TABLE `tabSupplier Type` ADD COLUMN `payment_terms` VARCHAR(140) NULL") diff --git a/erpnext/patches/v8_10/change_default_customer_credit_days.py b/erpnext/patches/v8_10/change_default_customer_credit_days.py index 9008a439402..d2bc3ec93e4 100644 --- a/erpnext/patches/v8_10/change_default_customer_credit_days.py +++ b/erpnext/patches/v8_10/change_default_customer_credit_days.py @@ -3,67 +3,49 @@ import frappe def execute(): + frappe.reload_doc("selling", "doctype", "customer") + frappe.reload_doc("buying", "doctype", "supplier") + frappe.reload_doc("setup", "doctype", "supplier_type") frappe.reload_doc("accounts", "doctype", "payment_term") frappe.reload_doc("accounts", "doctype", "payment_terms_template_detail") frappe.reload_doc("accounts", "doctype", "payment_terms_template") payment_terms = [] - customers = [] - suppliers = [] - credit_days = frappe.db.sql( - "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `customer_name` from " - "`tabCustomer` where credit_days_based_on='Fixed Days' or " - "credit_days_based_on='Last Day of the Next Month'") + records = [] + for doctype in ("Customer", "Supplier", "Supplier Type"): + credit_days = frappe.db.sql(""" + SELECT DISTINCT `credit_days`, `credit_days_based_on`, `name` + from `tab{0}` + where + (credit_days_based_on='Fixed Days' and credit_days is not null) + or credit_days_based_on='Last Day of the Next Month' + """.format(doctype)) - credit_records = ((record[0], record[1], record[2]) for record in credit_days) - for days, based_on, customer_name in credit_records: - payment_term = make_payment_term(days, based_on) - template = make_template(payment_term) - payment_terms.append('WHEN `customer_name`="%s" THEN "%s"' % (customer_name, template.template_name)) - customers.append(customer_name) + credit_records = ((record[0], record[1], record[2]) for record in credit_days) + for days, based_on, party_name in credit_records: + if based_on == "Fixed Days": + pyt_template_name = 'Default Payment Term - N{0}'.format(days) + else: + pyt_template_name = 'Default Payment Term - EO2M' - begin_query_str = "UPDATE `tabCustomer` SET `payment_terms` = CASE " - value_query_str = " ".join(payment_terms) - cond_query_str = " ELSE `payment_terms` END WHERE " + if not frappe.db.exists("Payment Terms Template", pyt_template_name): + payment_term = make_payment_term(days, based_on) + template = make_template(payment_term) + else: + template = frappe.get_doc("Payment Terms Template", pyt_template_name) - if customers: - frappe.db.sql( - begin_query_str + value_query_str + cond_query_str + '`customer_name` IN %s', - (customers,) - ) + payment_terms.append('WHEN `name`="%s" THEN "%s"' % (party_name, template.template_name)) + records.append(party_name) - # reset - payment_terms = [] - credit_days = frappe.db.sql( - "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `supplier_name` from " - "`tabSupplier` where credit_days_based_on='Fixed Days' or " - "credit_days_based_on='Last Day of the Next Month'") + begin_query_str = "UPDATE `tab{0}` SET `payment_terms` = CASE ".format(doctype) + value_query_str = " ".join(payment_terms) + cond_query_str = " ELSE `payment_terms` END WHERE " - credit_records = ((record[0], record[1], record[2]) for record in credit_days) - for days, based_on, supplier_name in credit_records: - if based_on == "Fixed Days": - pyt_template_name = 'Default Payment Term - N{0}'.format(days) - else: - pyt_template_name = 'Default Payment Term - EO2M' - - if not frappe.db.exists("Payment Term Template", pyt_template_name): - payment_term = make_payment_term(days, based_on) - template = make_template(payment_term) - else: - template = frappe.get_doc("Payment Term Template", pyt_template_name) - - payment_terms.append('WHEN `supplier_name`="%s" THEN "%s"' % (supplier_name, template.template_name)) - suppliers.append(supplier_name) - - begin_query_str = "UPDATE `tabSupplier` SET `payment_terms` = CASE " - value_query_str = " ".join(payment_terms) - cond_query_str = " ELSE `payment_terms` END WHERE " - - if suppliers: - frappe.db.sql( - begin_query_str + value_query_str + cond_query_str + '`supplier_name` IN %s', - (suppliers,) - ) + if records: + frappe.db.sql( + begin_query_str + value_query_str + cond_query_str + '`name` IN %s', + (records,) + ) def make_template(payment_term): diff --git a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py b/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py deleted file mode 100644 index 448bdbe15d8..00000000000 --- a/erpnext/patches/v8_10/change_default_supplier_type_credit_days.py +++ /dev/null @@ -1,39 +0,0 @@ -import frappe -from erpnext.patches.v8_10.change_default_customer_credit_days import make_payment_term, make_template - - -def execute(): - payment_terms = [] - supplier_types = [] - - credit_days = frappe.db.sql( - "SELECT DISTINCT `credit_days`, `credit_days_based_on`, `supplier_type` from " - "`tabSupplier Type` where credit_days_based_on='Fixed Days' or " - "credit_days_based_on='Last Day of the Next Month'") - - records = ((record[0], record[1], record[2]) for record in credit_days) - - for days, based_on, supplier_type in records: - if based_on == "Fixed Days": - pyt_term_name = 'N{0}'.format(days) - else: - pyt_term_name = 'EO2M' - - if not frappe.db.exists("Payment Term", pyt_term_name): - payment_term = make_payment_term(days, based_on) - make_template(payment_term) - else: - payment_term = frappe.get_doc("Payment Term", pyt_term_name) - - payment_terms.append('WHEN `supplier_type`="%s" THEN "%s"' % (supplier_type, payment_term.payment_term_name)) - supplier_types.append(supplier_type) - - begin_query_str = "UPDATE `tabSupplier Type` SET `payment_terms` = CASE " - value_query_str = " ".join(payment_terms) - cond_query_str = " ELSE `payment_terms` END WHERE " - - if supplier_types: - frappe.db.sql( - begin_query_str + value_query_str + cond_query_str + '`supplier_type` IN %s', - (supplier_types,) - ) diff --git a/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py index f54ff80ff58..8596e66cac8 100644 --- a/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py +++ b/erpnext/patches/v8_10/update_gl_due_date_for_pi_and_si.py @@ -6,6 +6,8 @@ import frappe def execute(): + frappe.reload_doc("accounts", "doctype", "gl_entry") + kwargs = get_query_kwargs() for kwarg in kwargs: diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index b70e467e6f2..91aafc9dff8 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1153,7 +1153,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ args: { terms_template: this.frm.doc.payment_terms_template, posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date, - grand_total: this.frm.doc.grand_total + grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total }, callback: function(r) { if(r.message && !r.exc) { @@ -1172,7 +1172,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ args: { term: row.payment_term, posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date, - grand_total: this.frm.doc.grand_total + grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total }, callback: function(r) { if(r.message && !r.exc) { From 96abfd2ab9fd6b5511c81aac06202032ea6fdc99 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 22 Nov 2017 15:13:16 +0530 Subject: [PATCH 157/164] [fix] In payment entry, run some events serially to avoid async issue --- .../doctype/payment_entry/payment_entry.js | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index c5e03064862..d8995a9d98a 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -253,20 +253,24 @@ frappe.ui.form.on('Payment Entry', { }, callback: function(r, rt) { if(r.message) { - if(frm.doc.payment_type == "Receive") { - frm.set_value("paid_from", r.message.party_account); - frm.set_value("paid_from_account_currency", r.message.party_account_currency); - frm.set_value("paid_from_account_balance", r.message.account_balance); - } else if (frm.doc.payment_type == "Pay"){ - frm.set_value("paid_to", r.message.party_account); - frm.set_value("paid_to_account_currency", r.message.party_account_currency); - frm.set_value("paid_to_account_balance", r.message.account_balance); - } - frm.set_value("party_balance", r.message.party_balance); - frm.events.get_outstanding_documents(frm); - frm.events.hide_unhide_fields(frm); - frm.events.set_dynamic_labels(frm); - frm.set_party_account_based_on_party = false; + frappe.run_serially([ + () => { + if(frm.doc.payment_type == "Receive") { + frm.set_value("paid_from", r.message.party_account); + frm.set_value("paid_from_account_currency", r.message.party_account_currency); + frm.set_value("paid_from_account_balance", r.message.account_balance); + } else if (frm.doc.payment_type == "Pay"){ + frm.set_value("paid_to", r.message.party_account); + frm.set_value("paid_to_account_currency", r.message.party_account_currency); + frm.set_value("paid_to_account_balance", r.message.account_balance); + } + }, + () => frm.set_value("party_balance", r.message.party_balance), + () => frm.events.get_outstanding_documents(frm), + () => frm.events.hide_unhide_fields(frm), + () => frm.events.set_dynamic_labels(frm), + () => { frm.set_party_account_based_on_party = false; } + ]); } } }); From 4dc5f0efaf0cbcd404672e56f04bc17f76a35664 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 22 Nov 2017 15:21:47 +0530 Subject: [PATCH 158/164] [Fix] Item details not fetching if item has no default bom (#11688) --- erpnext/controllers/buying_controller.py | 2 +- erpnext/stock/get_item_details.py | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index d3010818e5a..e5987359d01 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -171,7 +171,7 @@ class BuyingController(StockController): for item in self.get("items"): if self.doctype in ["Purchase Receipt", "Purchase Invoice"]: item.rm_supp_cost = 0.0 - if item.item_code in self.sub_contracted_items: + if item.bom and item.item_code in self.sub_contracted_items: self.update_raw_materials_supplied(item, raw_material_table) if [item.item_code, item.name] not in parent_items: diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 539e8a56676..9ec5d195be9 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -96,16 +96,6 @@ def get_item_details(args): return out - # print(frappe._dict({ - # 'has_serial_no' : out.has_serial_no, - # 'has_batch_no' : out.has_batch_no - # })) - - # return frappe._dict({ - # 'has_serial_no' : out.has_serial_no, - # 'has_batch_no' : out.has_batch_no - # }) - def process_args(args): if isinstance(args, basestring): args = json.loads(args) @@ -532,8 +522,6 @@ def get_default_bom(item_code=None): bom = frappe.db.get_value("BOM", {"docstatus": 1, "is_default": 1, "is_active": 1, "item": item_code}) if bom: return bom - else: - frappe.throw(_("No default BOM exists for Item {0}").format(item_code)) def get_valuation_rate(item_code, warehouse=None): item = frappe.get_doc("Item", item_code) From 02ac90134593c231e927f9346babfa644273d457 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 22 Nov 2017 16:12:20 +0530 Subject: [PATCH 159/164] [fix] Rounding adjustment in company currency --- erpnext/controllers/taxes_and_totals.py | 10 +--------- erpnext/public/js/controllers/taxes_and_totals.js | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 874ea5082ad..8232020dfe4 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -341,15 +341,7 @@ class calculate_taxes_and_totals(object): self.doc.rounding_adjustment += flt(self.doc.rounded_total - self.doc.grand_total, self.doc.precision("rounding_adjustment")) - if self.doc.meta.get_field("base_rounded_total"): - company_currency = erpnext.get_company_currency(self.doc.company) - - self.doc.base_rounded_total = \ - round_based_on_smallest_currency_fraction(self.doc.base_grand_total, - company_currency, self.doc.precision("base_rounded_total")) - - self.doc.base_rounding_adjustment += flt(self.doc.base_rounded_total - self.doc.base_grand_total, - self.doc.precision("base_rounding_adjustment")) + self._set_in_company_currency(self.doc, ["rounding_adjustment", "rounded_total"]) def _cleanup(self): for tax in self.doc.get("taxes"): diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index afdc87392ad..c7abed8305e 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -443,16 +443,8 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ this.frm.doc.currency, precision("rounded_total")); this.frm.doc.rounding_adjustment += flt(this.frm.doc.rounded_total - this.frm.doc.grand_total, precision("rounding_adjustment")); - } - if(frappe.meta.get_docfield(this.frm.doc.doctype, "base_rounded_total", this.frm.doc.name)) { - var company_currency = this.get_company_currency(); - this.frm.doc.base_rounded_total = - round_based_on_smallest_currency_fraction(this.frm.doc.base_grand_total, - company_currency, precision("base_rounded_total")); - - this.frm.doc.base_rounding_adjustment += flt(this.frm.doc.base_rounded_total - - this.frm.doc.base_grand_total, precision("rounding_adjustment")); + this.set_in_company_currency(this.frm.doc, ["rounding_adjustment", "rounded_total"]); } }, From 4bc12b68e45adfab84d3bedb62740aa8d72232f2 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 22 Nov 2017 18:24:18 +0600 Subject: [PATCH 160/164] bumped to version 9.2.16 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 30b021e0904..b16e299dc4b 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '9.2.15' +__version__ = '9.2.16' def get_default_company(user=None): '''Get default company for user''' From 30babee2ef08a04ffb8d08d085b19328b521491b Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 23 Nov 2017 12:19:57 +0530 Subject: [PATCH 161/164] add courses in the program enrollment (#11694) --- .../schools/doctype/program_enrollment/program_enrollment.js | 5 ++++- .../schools/doctype/program_enrollment/program_enrollment.py | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/erpnext/schools/doctype/program_enrollment/program_enrollment.js b/erpnext/schools/doctype/program_enrollment/program_enrollment.js index 8418e855266..89728607fcb 100644 --- a/erpnext/schools/doctype/program_enrollment/program_enrollment.js +++ b/erpnext/schools/doctype/program_enrollment/program_enrollment.js @@ -1,9 +1,12 @@ // Copyright (c) 2016, Frappe and contributors // For license information, please see license.txt -cur_frm.add_fetch('fee_structure', 'total_amount', 'amount'); frappe.ui.form.on("Program Enrollment", { + setup: function(frm) { + frm.add_fetch('fee_structure', 'total_amount', 'amount'); + }, + onload: function(frm, cdt, cdn){ frm.set_query("academic_term", "fees", function(){ return{ diff --git a/erpnext/schools/doctype/program_enrollment/program_enrollment.py b/erpnext/schools/doctype/program_enrollment/program_enrollment.py index 4e679082c67..a6f7bdfe786 100644 --- a/erpnext/schools/doctype/program_enrollment/program_enrollment.py +++ b/erpnext/schools/doctype/program_enrollment/program_enrollment.py @@ -14,6 +14,8 @@ class ProgramEnrollment(Document): self.validate_duplication() if not self.student_name: self.student_name = frappe.db.get_value("Student", self.student, "title") + if not self.courses: + self.extend("courses", self.get_courses()) def on_submit(self): self.update_student_joining_date() From 82027ea3bff50be29f08eb0c670adaaae2a2c0e8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 23 Nov 2017 12:49:42 +0530 Subject: [PATCH 162/164] Set print hide property for payment terms --- .../accounts/doctype/payment_schedule/payment_schedule.json | 6 +++--- .../accounts/doctype/purchase_invoice/purchase_invoice.json | 4 ++-- erpnext/accounts/doctype/sales_invoice/sales_invoice.json | 6 +++--- erpnext/buying/doctype/purchase_order/purchase_order.json | 4 ++-- erpnext/selling/doctype/quotation/quotation.json | 4 ++-- erpnext/selling/doctype/sales_order/sales_order.json | 6 +++--- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json index b34f894538c..854def0c732 100644 --- a/erpnext/accounts/doctype/payment_schedule/payment_schedule.json +++ b/erpnext/accounts/doctype/payment_schedule/payment_schedule.json @@ -34,7 +34,7 @@ "options": "Payment Term", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -127,7 +127,7 @@ "options": "payment_term.invoice_portion", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -179,7 +179,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-11-21 19:23:08.490659", + "modified": "2017-11-23 12:39:02.013040", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Schedule", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 75e121e7cb1..2112fa158e1 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -3025,7 +3025,7 @@ "options": "Payment Terms Template", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -3853,7 +3853,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-21 01:04:15.308603", + "modified": "2017-11-23 01:04:15.308603", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index e013dc682bc..41b92c43f88 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2801,7 +2801,7 @@ "options": "Payment Terms Template", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -4532,9 +4532,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-17 01:02:36.885752", + "modified": "2017-11-23 12:36:53.731902", "modified_by": "Administrator", - "module": "Accounts", + "module": "Accounts", "name": "Sales Invoice", "name_case": "Title Case", "owner": "Administrator", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 8f6f468f4c6..ecd6e66d8bf 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2491,7 +2491,7 @@ "options": "Payment Terms Template", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -3264,7 +3264,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-11-18 01:03:44.591992", + "modified": "2017-11-23 01:03:44.591992", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 440d26b9d0a..53a3aa1d284 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2205,7 +2205,7 @@ "options": "Payment Terms Template", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -2851,7 +2851,7 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-11-17 01:01:16.774645", + "modified": "2017-11-23 12:39:36.234663", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 1acb8c1861a..acd62799956 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2384,7 +2384,7 @@ "options": "Payment Terms Template", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -3499,9 +3499,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-11-17 01:02:08.674118", + "modified": "2017-11-23 12:39:24.362238", "modified_by": "Administrator", - "module": "Selling", + "module": "Selling", "name": "Sales Order", "owner": "Administrator", "permissions": [ From acccdb38900f702d5c41c4063a25e193850554d8 Mon Sep 17 00:00:00 2001 From: tundebabzy Date: Thu, 23 Nov 2017 08:35:15 +0100 Subject: [PATCH 163/164] Default batch number selection (#11454) * fetch batch_no in `get_basic_details` * PEP8 changes and docstring * only auto-fetch batch number for Sales documents: otherwise, automatic batch creation will not work properly because all new stock will be added to old batch * new function to fetch batch number using FEFO: FEFO - First Expiring First Out * fetch batch number in `get_basic_details` using FEFO * add new function - `set_batch_number` * `set_batch_number` when `qty` is triggered * `set_batch_number` when `uom` is triggered * whitelist `get_batch_no_fefo` * code clean up * move `set_batch_number` to conversion_factor instead of uom * rename `get_batch_no_fefo` to `get_batch_no` * fix test case * final cleanup * Revert "fetch batch_no in `get_basic_details`" This reverts commit dd024b1eb369eaeafab28165d523fb7a9f8ab8d3. * fix test case * update Sales Invoice manual * move changes away from `transaction.js` * query should not fetch expired batches * refactor `get_batch_no`: add new function `get_batches` * Update batch.py --- .../user/manual/en/accounts/sales-invoice.md | 15 +++++ erpnext/selling/sales_common.js | 37 ++++++++++- erpnext/stock/doctype/batch/batch.py | 49 ++++++++++---- erpnext/stock/doctype/batch/test_batch.py | 66 +++++++++---------- erpnext/stock/get_item_details.py | 51 ++++++++++++-- 5 files changed, 167 insertions(+), 51 deletions(-) diff --git a/erpnext/docs/user/manual/en/accounts/sales-invoice.md b/erpnext/docs/user/manual/en/accounts/sales-invoice.md index f4c41435042..3ea13f09b58 100644 --- a/erpnext/docs/user/manual/en/accounts/sales-invoice.md +++ b/erpnext/docs/user/manual/en/accounts/sales-invoice.md @@ -56,6 +56,21 @@ bill this Invoice and the period for which the contract is valid. ERPNext will automatically create new Invoices and mail it to the Email Addresses you set. +#### Automatically Fetching Item Batch Numbers + +If you are selling an item from a [Batch](/docs/user/manual/en/stock/batch), +ERPNext will automatically fetch a batch number for you if "Update Stock" +is checked. The batch number will be fetched on a First Expiring First Out +(FEFO) basis. This is a variant of First In First Out (FIFO) that gives +highest priority to the soonest to expire Items. + +POS Invoice + +Note that if the first batch in the queue cannot satisfy the order on the invoice, +the next batch in the queue that can satisfy the order will be selected. If there is +no batch that can satisfy the order, ERPNext will cancel its attempt to automatically +fetch a suitable batch number. + #### POS Invoices Consider a scenario where retail transaction is carried out. For e.g: A retail shop. diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index 97b7b99d08f..6a148e202aa 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -335,7 +335,42 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ } else { this.frm.set_value("company_address_display", ""); } - } + }, + + conversion_factor: function(doc, cdt, cdn, dont_fetch_price_list_rate) { + this._super(doc, cdt, cdn, dont_fetch_price_list_rate); + if(frappe.meta.get_docfield(cdt, "stock_qty", cdn)) { + this.set_batch_number(cdt, cdn); + } + }, + + qty: function(doc, cdt, cdn) { + this._super(doc, cdt, cdn); + this.set_batch_number(cdt, cdn); + }, + + /* Determine appropriate batch number and set it in the form. + * @param {string} cdt - Document Doctype + * @param {string} cdn - Document name + */ + set_batch_number: function(cdt, cdn) { + const doc = frappe.get_doc(cdt, cdn); + if(doc) { + this._set_batch_number(doc); + } + }, + + _set_batch_number: function(doc) { + return frappe.call({ + method: 'erpnext.stock.doctype.batch.batch.get_batch_no', + args: {'item_code': doc.item_code, 'warehouse': doc.warehouse, 'qty': flt(doc.qty) * flt(doc.conversion_factor)}, + callback: function(r) { + if(r.message) { + frappe.model.set_value(doc.doctype, doc.name, 'batch_no', r.message); + } + } + }); + }, }); frappe.ui.form.on(cur_frm.doctype,"project", function(frm) { diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py index c58a98d7c8a..8d72ac3e2ca 100644 --- a/erpnext/stock/doctype/batch/batch.py +++ b/erpnext/stock/doctype/batch/batch.py @@ -5,7 +5,8 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.model.document import Document -from frappe.utils import flt +from frappe.utils import flt, cint + class UnableToSelectBatchError(frappe.ValidationError): pass @@ -53,16 +54,19 @@ def get_batch_qty(batch_no=None, warehouse=None, item_code=None): from `tabStock Ledger Entry` where warehouse=%s and batch_no=%s""", (warehouse, batch_no))[0][0] or 0) + if batch_no and not warehouse: out = frappe.db.sql('''select warehouse, sum(actual_qty) as qty from `tabStock Ledger Entry` where batch_no=%s group by warehouse''', batch_no, as_dict=1) + if not batch_no and item_code and warehouse: out = frappe.db.sql('''select batch_no, sum(actual_qty) as qty from `tabStock Ledger Entry` where item_code = %s and warehouse=%s group by batch_no''', (item_code, warehouse), as_dict=1) + return out @frappe.whitelist() @@ -114,21 +118,42 @@ def set_batch_nos(doc, warehouse_field, throw = False): if flt(batch_qty) < flt(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.qty)) -def get_batch_no(item_code, warehouse, qty, throw=False): - '''get the smallest batch with for the given item_code, warehouse and qty''' +@frappe.whitelist() +def get_batch_no(item_code, warehouse, qty=1, throw=False): + """ + Get batch number using First Expiring First Out method. + :param item_code: `item_code` of Item Document + :param warehouse: name of Warehouse to check + :param qty: quantity of Items + :return: String represent batch number of batch with sufficient quantity else an empty String + """ batch_no = None - batches = get_batch_qty(item_code = item_code, warehouse = warehouse) - if batches: - batches = sorted(batches, lambda a, b: 1 if a.qty > b.qty else -1) - for b in batches: - if b.qty >= qty: - batch_no = b.batch_no - # found! - break + batches = get_batches(item_code, warehouse, qty, throw) + + for batch in batches: + if cint(qty) <= cint(batch.qty): + batch_no = batch.batch_id + break if not batch_no: frappe.msgprint(_('Please select a Batch for Item {0}. Unable to find a single batch that fulfills this requirement').format(frappe.bold(item_code))) - if throw: raise UnableToSelectBatchError + if throw: + raise UnableToSelectBatchError return batch_no + + +def get_batches(item_code, warehouse, qty=1, throw=False): + batches = frappe.db.sql( + 'select batch_id, sum(actual_qty) as qty from `tabBatch` join `tabStock Ledger Entry` ' + 'on `tabBatch`.batch_id = `tabStock Ledger Entry`.batch_no ' + 'where `tabStock Ledger Entry`.item_code = %s and `tabStock Ledger Entry`.warehouse = %s ' + 'and `tabBatch`.expiry_date >= CURDATE() or `tabBatch`.expiry_date IS NULL ' + 'group by batch_id ' + 'order by `tabBatch`.expiry_date DESC, `tabBatch`.creation ASC', + (item_code, warehouse), + as_dict=True + ) + + return batches diff --git a/erpnext/stock/doctype/batch/test_batch.py b/erpnext/stock/doctype/batch/test_batch.py index eb3b48eb9e5..a327b2ded9f 100644 --- a/erpnext/stock/doctype/batch/test_batch.py +++ b/erpnext/stock/doctype/batch/test_batch.py @@ -6,7 +6,7 @@ import frappe from frappe.exceptions import ValidationError import unittest -from erpnext.stock.doctype.batch.batch import get_batch_qty, UnableToSelectBatchError +from erpnext.stock.doctype.batch.batch import get_batch_qty, UnableToSelectBatchError, get_batch_no class TestBatch(unittest.TestCase): @@ -28,13 +28,13 @@ class TestBatch(unittest.TestCase): self.make_batch_item('ITEM-BATCH-1') receipt = frappe.get_doc(dict( - doctype = 'Purchase Receipt', - supplier = '_Test Supplier', - items = [ + doctype='Purchase Receipt', + supplier='_Test Supplier', + items=[ dict( - item_code = 'ITEM-BATCH-1', - qty = batch_qty, - rate = 10 + item_code='ITEM-BATCH-1', + qty=batch_qty, + rate=10 ) ] )).insert() @@ -74,28 +74,28 @@ class TestBatch(unittest.TestCase): '''Test automatic batch selection for outgoing items''' batch_qty = 15 receipt = self.test_purchase_receipt(batch_qty) + item_code = 'ITEM-BATCH-1' delivery_note = frappe.get_doc(dict( - doctype = 'Delivery Note', - customer = '_Test Customer', - company = receipt.company, - items = [ + doctype='Delivery Note', + customer='_Test Customer', + company=receipt.company, + items=[ dict( - item_code = 'ITEM-BATCH-1', - qty = batch_qty, - rate = 10, - warehouse = receipt.items[0].warehouse + item_code=item_code, + qty=batch_qty, + rate=10, + warehouse=receipt.items[0].warehouse ) ] )).insert() delivery_note.submit() - # shipped with same batch - self.assertEquals(delivery_note.items[0].batch_no, receipt.items[0].batch_no) - - # balance is 0 - self.assertEquals(get_batch_qty(receipt.items[0].batch_no, - receipt.items[0].warehouse), 0) + # shipped from FEFO batch + self.assertEquals( + delivery_note.items[0].batch_no, + get_batch_no(item_code, receipt.items[0].warehouse, batch_qty) + ) def test_delivery_note_fail(self): '''Test automatic batch selection for outgoing items''' @@ -120,27 +120,27 @@ class TestBatch(unittest.TestCase): batch_qty = 16 receipt = self.test_purchase_receipt(batch_qty) + item_code = 'ITEM-BATCH-1' stock_entry = frappe.get_doc(dict( - doctype = 'Stock Entry', - purpose = 'Material Issue', - company = receipt.company, - items = [ + doctype='Stock Entry', + purpose='Material Issue', + company=receipt.company, + items=[ dict( - item_code = 'ITEM-BATCH-1', - qty = batch_qty, - s_warehouse = receipt.items[0].warehouse, + item_code=item_code, + qty=batch_qty, + s_warehouse=receipt.items[0].warehouse, ) ] )).insert() stock_entry.submit() # assert same batch is selected - self.assertEqual(stock_entry.items[0].batch_no, receipt.items[0].batch_no) - - # balance is 0 - self.assertEquals(get_batch_qty(receipt.items[0].batch_no, - receipt.items[0].warehouse), 0) + self.assertEqual( + stock_entry.items[0].batch_no, + get_batch_no(item_code, receipt.items[0].warehouse, batch_qty) + ) def test_batch_split(self): '''Test batch splitting''' diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index b9258b03f25..e5cd2fed237 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -11,6 +11,7 @@ from erpnext.setup.utils import get_exchange_rate from frappe.model.meta import get_field_precision from erpnext.stock.doctype.batch.batch import get_batch_no + @frappe.whitelist() def get_item_details(args): """ @@ -84,7 +85,6 @@ def get_item_details(args): if out.has_batch_no and not args.get("batch_no"): out.batch_no = get_batch_no(out.item_code, out.warehouse, out.qty) - if args.transaction_date and item.lead_time_days: out.schedule_date = out.lead_time_date = add_days(args.transaction_date, item.lead_time_days) @@ -113,6 +113,7 @@ def process_args(args): set_transaction_type(args) return args + @frappe.whitelist() def get_item_code(barcode=None, serial_no=None): if barcode: @@ -126,6 +127,7 @@ def get_item_code(barcode=None, serial_no=None): return item_code + def validate_item_details(args, item): if not args.company: throw(_("Please specify Company")) @@ -133,14 +135,52 @@ def validate_item_details(args, item): from erpnext.stock.doctype.item.item import validate_end_of_life validate_end_of_life(item.name, item.end_of_life, item.disabled) - if args.transaction_type=="selling" and cint(item.has_variants): + if args.transaction_type == "selling" and cint(item.has_variants): throw(_("Item {0} is a template, please select one of its variants").format(item.name)) - elif args.transaction_type=="buying" and args.doctype != "Material Request": + elif args.transaction_type == "buying" and args.doctype != "Material Request": if args.get("is_subcontracted") == "Yes" and item.is_sub_contracted_item != 1: throw(_("Item {0} must be a Sub-contracted Item").format(item.name)) + def get_basic_details(args, item): + """ + :param args: { + "item_code": "", + "warehouse": None, + "customer": "", + "conversion_rate": 1.0, + "selling_price_list": None, + "price_list_currency": None, + "plc_conversion_rate": 1.0, + "doctype": "", + "name": "", + "supplier": None, + "transaction_date": None, + "conversion_rate": 1.0, + "buying_price_list": None, + "is_subcontracted": "Yes" / "No", + "ignore_pricing_rule": 0/1 + "project": "", + barcode: "", + serial_no: "", + warehouse: "", + currency: "", + update_stock: "", + price_list: "", + company: "", + order_type: "", + is_pos: "", + ignore_pricing_rule: "", + project: "", + qty: "", + stock_qty: "", + conversion_factor: "" + } + :param item: `item_code` of Item object + :return: frappe._dict + """ + if not item: item = frappe.get_doc("Item", args.get("item_code")) @@ -150,7 +190,7 @@ def get_basic_details(args, item): from frappe.defaults import get_user_default_as_list user_default_warehouse_list = get_user_default_as_list('Warehouse') user_default_warehouse = user_default_warehouse_list[0] \ - if len(user_default_warehouse_list)==1 else "" + if len(user_default_warehouse_list) == 1 else "" warehouse = user_default_warehouse or item.default_warehouse or args.warehouse @@ -207,7 +247,7 @@ def get_basic_details(args, item): out.conversion_factor = 1.0 else: out.conversion_factor = args.conversion_factor or \ - get_conversion_factor(item.item_code, args.uom).get("conversion_factor") or 1.0 + get_conversion_factor(item.item_code, args.uom).get("conversion_factor") or 1.0 args.conversion_factor = out.conversion_factor out.stock_qty = out.qty * out.conversion_factor @@ -227,6 +267,7 @@ def get_basic_details(args, item): return out + def get_default_income_account(args, item): return (item.income_account or args.income_account From 966f141f624a1e68d5f1ee7f0500618aa9b5ef50 Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 23 Nov 2017 15:22:10 +0530 Subject: [PATCH 164/164] Rename schools to Education (#11524) * renaming for the docs, demo data and patch * changes in the doctypes and reports * rename the config file * Few name changes in messages and license * rename the school settings to education settings * changes in the documentation * added the setup file for the fixtures * corrected the ui tests file path * fix the codacy * add the patch for renaming few doctypes and fields * changes in the patch --- .eslintrc | 1 + erpnext/config/desktop.py | 16 +- erpnext/config/{schools.py => education.py} | 2 +- ...{item_schools.json => item_education.json} | 0 erpnext/demo/demo.py | 4 +- erpnext/demo/setup/education.py | 2 +- erpnext/demo/setup/setup_data.py | 4 +- .../demo/user/{schools.py => education.py} | 8 +- .../img/{schools => education}/__init__.py | 0 .../admission/__init__.py | 0 .../admission/program-enrollment-tool.gif | Bin .../admission/program-enrollment-tool01.gif | Bin .../admission/program-enrollment.gif | Bin .../admission/student-admission.gif | Bin .../admission/student-applicant-enroll.png | Bin .../admission/student-applicant.png | Bin .../admission/student-application-actions.png | Bin .../assessment/__init__.py | 0 .../assessment/assessment-criteria.png | Bin .../assessment/assessment-group-details.png | Bin .../assessment/assessment-group-term.png | Bin .../assessment/assessment-plan-criteria.png | Bin .../assessment/assessment-plan-details.png | Bin .../assessment/assessment-result-tool.png | Bin .../assessment/assessment-result.png | Bin .../assessment/grading-scale.png | Bin .../{schools => education}/fees/__init__.py | 0 .../fees/fee-category.png | Bin .../fees/fee-structure.png | Bin .../fees/fees-section.png | Bin .../img/{schools => education}/fees/fees.png | Bin .../img/{schools => education}/home.png | Bin .../img/{schools => education}/module.png | Bin .../schedule/__init__.py | 0 .../schedule/course-schedule-att-1.png | Bin .../schedule/course-schedule-att.png | Bin .../schedule/course-schedule.png | Bin .../schedule/examination.png | Bin .../schedule/schedule-section.png | Bin .../schedule/scheduling-tool.png | Bin .../schedule/student-attendance.gif | Bin .../schedule/student-attendance.png | Bin .../schedule/student-leave-application.gif | Bin .../setup/Course-schedule-error.png | Bin .../setup/Room-Assesment-plan.png | Bin .../{schools => education}/setup/__init__.py | 0 .../setup/academic-term.png | Bin .../setup/academic-year.png | Bin .../setup/course-fee-program.png | Bin .../{schools => education}/setup/course.png | Bin .../setup/instructor.png | Bin .../{schools => education}/setup/program.png | Bin .../img/{schools => education}/setup/room.png | Bin .../setup/student-attendance-tool.gif | Bin .../setup/student-group-instructor.png | Bin .../student/__init__.py | 0 .../student/guardian.png | Bin .../student/schools-settings.png | Bin .../student/student group.gif | Bin .../student/student-admission.gif | Bin .../student/student-batch-validation.gif | Bin .../student/student-batch.gif | Bin .../student/student-course-validation.gif | Bin .../student/student-group-attendance.gif | Bin .../student/student-group-creation-tool.gif | Bin .../student/student-log.png | Bin .../student/student.png | Bin .../Assessment/__init__.py | 0 .../Assessment/assessment_criteria.md | 4 +- .../Assessment/assessment_criteria_group.md | 0 .../Assessment/assessment_group.md | 4 +- .../Assessment/assessment_plan.md | 4 +- .../Assessment/assessment_result.md | 4 +- .../Assessment/assessment_result_tool.md | 2 +- .../Assessment/grading_scale.md | 2 +- .../Assessment/index.md | 0 .../Assessment/index.txt | 0 .../Attendance/__init__.py | 0 .../Attendance/index.md | 0 .../Attendance/index.txt | 0 .../Attendance/student-attendance-tool.md | 2 +- .../Attendance/student-attendance.md | 2 +- .../Attendance/student-leave-application.md | 4 +- .../en/{schools => education}/__init__.py | 0 .../admission/__init__.py | 0 .../{schools => education}/admission/index.md | 0 .../admission/index.txt | 0 .../admission/program-enrollment-tool.md | 4 +- .../admission/program-enrollment.md | 2 +- .../admission/student-applicant.md | 8 +- .../admission/student_admission.md | 4 +- .../{schools => education}/fees/__init__.py | 0 .../fees/fee-category.md | 2 +- .../fees/fee-structure.md | 2 +- .../user/manual/en/education/fees/fees.md | 8 + .../en/{schools => education}/fees/index.md | 2 +- .../en/{schools => education}/fees/index.txt | 0 .../docs/user/manual/en/education/index.md | 8 + .../en/{schools => education}/index.txt | 0 .../schedule/__init__.py | 0 .../schedule/course-schedule.md | 6 +- .../schedule/examination.md | 2 +- .../{schools => education}/schedule/index.md | 2 +- .../{schools => education}/schedule/index.txt | 0 .../schedule/scheduling-tool.md | 2 +- .../{schools => education}/setup/__init__.py | 0 .../setup/academic-term.md | 2 +- .../setup/academic-year.md | 4 +- .../en/{schools => education}/setup/course.md | 4 +- .../user/manual/en/education/setup/index.md | 9 + .../en/{schools => education}/setup/index.txt | 2 +- .../setup/instructor.md | 6 +- .../{schools => education}/setup/program.md | 6 +- .../en/{schools => education}/setup/room.md | 6 +- .../en/education/setup/school-settings.md | 15 + .../setup/student-batch-name.md | 2 +- .../setup/student-category.md | 2 +- .../student/__init__.py | 0 .../student/guardian.md | 2 +- .../{schools => education}/student/index.md | 0 .../{schools => education}/student/index.txt | 0 .../student/student-batch.md | 2 +- .../student/student-group-creation-tool.md | 4 +- .../student/student-group.md | 6 +- .../student/student-log.md | 2 +- .../{schools => education}/student/student.md | 2 +- erpnext/docs/user/manual/en/index.txt | 1 + .../docs/user/manual/en/schools/fees/fees.md | 8 - erpnext/docs/user/manual/en/schools/index.md | 8 - .../user/manual/en/schools/setup/index.md | 9 - .../en/schools/setup/school-settings.md | 15 - .../Assessment/__init__.py | 0 .../Assessment/assessment_criteria.md | 4 +- .../Assessment/assessment_group.md | 4 +- .../Assessment/assessment_plan.md | 4 +- .../Assessment/assessment_result.md | 4 +- .../Assessment/assessment_result_tool.md | 2 +- .../Assessment/grading_scale.md | 2 +- .../Assessment/index.md | 0 .../Assessment/index.txt | 0 .../es/{schools => education}/__init__.py | 0 .../admission/__init__.py | 0 .../{schools => education}/admission/index.md | 0 .../admission/index.txt | 0 .../admission/program-enrollment.md | 2 +- .../admission/student-applicant.md | 6 +- .../{schools => education}/fees/__init__.py | 0 .../fees/fee-category.md | 2 +- .../fees/fee-structure.md | 2 +- .../user/manual/es/education/fees/fees.md | 8 + .../es/{schools => education}/fees/index.md | 2 +- .../es/{schools => education}/fees/index.txt | 0 .../manual/es/{schools => education}/index.md | 4 +- .../es/{schools => education}/index.txt | 0 .../schedule/__init__.py | 0 .../schedule/course-schedule.md | 6 +- .../schedule/examination.md | 2 +- .../{schools => education}/schedule/index.md | 2 +- .../{schools => education}/schedule/index.txt | 0 .../schedule/scheduling-tool.md | 2 +- .../schedule/student-attendance.md | 2 +- .../{schools => education}/setup/__init__.py | 0 .../setup/academic-term.md | 2 +- .../setup/academic-year.md | 2 +- .../user/manual/es/education/setup/course.md | 5 + .../es/{schools => education}/setup/index.md | 2 +- .../es/{schools => education}/setup/index.txt | 0 .../manual/es/education/setup/instructor.md | 5 + .../user/manual/es/education/setup/program.md | 5 + .../user/manual/es/education/setup/room.md | 6 + .../student/__init__.py | 0 .../{schools => education}/student/index.md | 0 .../{schools => education}/student/index.txt | 0 .../student/student-batch.md | 2 +- .../student/student-group-creation-tool.md | 2 +- .../student/student-group.md | 2 +- .../student/student-log.md | 2 +- .../{schools => education}/student/student.md | 2 +- erpnext/docs/user/manual/es/index.txt | 2 +- .../docs/user/manual/es/schools/fees/fees.md | 8 - .../user/manual/es/schools/setup/course.md | 5 - .../manual/es/schools/setup/instructor.md | 5 - .../user/manual/es/schools/setup/program.md | 5 - .../docs/user/manual/es/schools/setup/room.md | 6 - erpnext/docs/user/videos/learn/education.md | 7 + erpnext/docs/user/videos/learn/index.md | 4 +- erpnext/docs/user/videos/learn/schools.md | 7 - erpnext/domains/education.py | 23 +- erpnext/{schools => education}/__init__.py | 0 erpnext/{schools => education}/api.py | 0 .../doctype/__init__.py | 0 .../doctype/academic_term/__init__.py | 0 .../doctype/academic_term/academic_term.js | 0 .../doctype/academic_term/academic_term.json | 4 +- .../doctype/academic_term/academic_term.py | 0 .../academic_term/test_academic_term.js | 4 +- .../academic_term/test_academic_term.py | 0 .../doctype/academic_term/test_records.json | 0 .../doctype/academic_year/__init__.py | 0 .../doctype/academic_year/academic_year.js | 0 .../doctype/academic_year/academic_year.json | 4 +- .../doctype/academic_year/academic_year.py | 0 .../academic_year/test_academic_year.js | 4 +- .../academic_year/test_academic_year.py | 0 .../doctype/academic_year/test_records.json | 0 .../doctype/assessment_criteria/__init__.py | 0 .../assessment_criteria.js | 0 .../assessment_criteria.json | 4 +- .../assessment_criteria.py | 0 .../test_assessment_criteria.js | 4 +- .../test_assessment_criteria.py | 0 .../assessment_criteria/test_records.json | 0 .../assessment_criteria_group/__init__.py | 0 .../assessment_criteria_group.js | 0 .../assessment_criteria_group.json | 4 +- .../assessment_criteria_group.py | 0 .../test_assessment_criteria_group.js | 4 +- .../test_assessment_criteria_group.py | 0 .../doctype/assessment_group/__init__.py | 0 .../assessment_group/assessment_group.js | 0 .../assessment_group/assessment_group.json | 4 +- .../assessment_group/assessment_group.py | 0 .../assessment_group/assessment_group_tree.js | 0 .../assessment_group/test_assessment_group.js | 4 +- .../assessment_group/test_assessment_group.py | 0 .../doctype/assessment_plan/__init__.py | 0 .../assessment_plan/assessment_plan.js | 2 +- .../assessment_plan/assessment_plan.json | 4 +- .../assessment_plan/assessment_plan.py | 2 +- .../assessment_plan/test_assessment_plan.js | 4 +- .../assessment_plan/test_assessment_plan.py | 0 .../assessment_plan_criteria/__init__.py | 0 .../assessment_plan_criteria.json | 4 +- .../assessment_plan_criteria.py | 0 .../doctype/assessment_result/__init__.py | 0 .../assessment_result/assessment_result.js | 4 +- .../assessment_result/assessment_result.json | 4 +- .../assessment_result/assessment_result.py | 4 +- .../test_assessment_result.js | 6 +- .../test_assessment_result.py | 2 +- .../assessment_result_detail/__init__.py | 0 .../assessment_result_detail.json | 4 +- .../assessment_result_detail.py | 0 .../assessment_result_tool/__init__.py | 0 .../assessment_result_tool.js | 8 +- .../assessment_result_tool.json | 4 +- .../assessment_result_tool.py | 0 .../test_assessment_result_tool.js | 4 +- .../test_assessment_result_tool.py | 10 + .../doctype/course/__init__.py | 0 .../doctype/course/course.js | 0 .../doctype/course/course.json | 4 +- .../doctype/course/course.py | 0 .../doctype/course/test_course.js | 4 +- .../doctype/course/test_course.py | 0 .../doctype/course/test_records.json | 0 .../course_assessment_criteria/__init__.py | 0 .../course_assessment_criteria.json | 4 +- .../course_assessment_criteria.py | 0 .../doctype/course_schedule/__init__.py | 0 .../course_schedule/course_schedule.js | 2 +- .../course_schedule/course_schedule.json | 4 +- .../course_schedule/course_schedule.py | 2 +- .../course_schedule_calendar.js | 2 +- .../course_schedule/test_course_schedule.js | 23 + .../course_schedule/test_course_schedule.py | 2 +- .../course_scheduling_tool/__init__.py | 0 .../course_scheduling_tool.js | 0 .../course_scheduling_tool.json | 2 +- .../course_scheduling_tool.py | 2 +- .../test_course_scheduling_tool.js | 23 + .../test_course_scheduling_tool.py | 10 + .../doctype/education_settings}/__init__.py | 0 .../education_settings/education_settings.js} | 2 +- .../education_settings.json} | 6 +- .../education_settings/education_settings.py} | 9 +- .../test_education_settings.js} | 18 +- .../test_education_settings.py | 10 + .../doctype/fee_category}/__init__.py | 0 .../doctype/fee_category/fee_category.js | 0 .../doctype/fee_category/fee_category.json | 4 +- .../doctype/fee_category/fee_category.py | 0 .../doctype/fee_category/test_fee_category.js | 23 + .../doctype/fee_category/test_fee_category.py | 0 .../doctype/fee_category/test_records.json | 0 .../doctype/fee_component}/__init__.py | 0 .../doctype/fee_component/fee_component.json | 4 +- .../doctype/fee_component/fee_component.py | 0 .../doctype/fee_schedule}/__init__.py | 0 .../doctype/fee_schedule/fee_schedule.js | 4 +- .../doctype/fee_schedule/fee_schedule.json | 4 +- .../doctype/fee_schedule/fee_schedule.py | 0 .../doctype/fee_schedule/fee_schedule_list.js | 0 .../doctype/fee_schedule/test_fee_schedule.js | 0 .../doctype/fee_schedule/test_fee_schedule.py | 0 .../doctype/fee_schedule_program}/__init__.py | 0 .../fee_schedule_program.json | 4 +- .../fee_schedule_program.py | 0 .../fee_schedule_student_group}/__init__.py | 0 .../fee_schedule_student_group.json | 4 +- .../fee_schedule_student_group.py | 0 .../doctype/fee_structure}/__init__.py | 0 .../doctype/fee_structure/fee_structure.js | 2 +- .../doctype/fee_structure/fee_structure.json | 4 +- .../doctype/fee_structure/fee_structure.py | 0 .../fee_structure/test_fee_structure.js | 0 .../fee_structure/test_fee_structure.py | 0 .../doctype/fee_structure/test_records.json | 0 .../doctype/fees}/__init__.py | 0 .../doctype/fees/fees.js | 4 +- .../doctype/fees/fees.json | 4 +- .../doctype/fees/fees.py | 0 .../doctype/fees/fees_list.js | 0 .../doctype/fees/test_fees.js | 0 .../doctype/fees/test_fees.py | 0 .../doctype/grading_scale}/__init__.py | 0 .../doctype/grading_scale/grading_scale.js | 0 .../doctype/grading_scale/grading_scale.json | 4 +- .../doctype/grading_scale/grading_scale.py | 0 .../grading_scale/test_grading_scale.js | 4 +- .../grading_scale/test_grading_scale.py | 0 .../doctype/grading_scale/test_records.json | 0 .../grading_scale_interval}/__init__.py | 0 .../grading_scale_interval.json | 4 +- .../grading_scale_interval.py | 0 .../doctype/guardian}/__init__.py | 0 .../doctype/guardian/guardian.js | 0 .../doctype/guardian/guardian.json | 4 +- .../doctype/guardian/guardian.py | 0 .../doctype/guardian/test_guardian.js | 4 +- .../doctype/guardian/test_guardian.py | 0 .../doctype/guardian_interest}/__init__.py | 0 .../guardian_interest/guardian_interest.json | 4 +- .../guardian_interest/guardian_interest.py | 0 .../doctype/guardian_student}/__init__.py | 0 .../guardian_student/guardian_student.json | 4 +- .../guardian_student/guardian_student.py | 0 .../doctype/instructor}/__init__.py | 0 .../doctype/instructor/instructor.js | 0 .../doctype/instructor/instructor.json | 4 +- .../doctype/instructor/instructor.py | 4 +- .../doctype/instructor/test_instructor.js | 4 +- .../doctype/instructor/test_instructor.py | 0 .../doctype/instructor/test_records.json | 0 .../doctype/program}/__init__.py | 0 .../doctype/program/program.js | 0 .../doctype/program/program.json | 4 +- .../doctype/program/program.py | 0 .../doctype/program/test_program.js | 4 +- .../doctype/program/test_program.py | 0 .../doctype/program/test_records.json | 0 .../doctype/program_course}/__init__.py | 0 .../program_course/program_course.json | 4 +- .../doctype/program_course/program_course.py | 0 .../doctype/program_enrollment}/__init__.py | 0 .../program_enrollment/program_enrollment.js | 6 +- .../program_enrollment.json | 6 +- .../program_enrollment/program_enrollment.py | 2 +- .../test_program_enrollment.js | 23 + .../test_program_enrollment.py | 0 .../program_enrollment_course}/__init__.py | 0 .../program_enrollment_course.json | 4 +- .../program_enrollment_course.py | 0 .../program_enrollment_fee}/__init__.py | 0 .../program_enrollment_fee.json | 4 +- .../program_enrollment_fee.py | 0 .../program_enrollment_tool}/__init__.py | 0 .../program_enrollment_tool.js | 0 .../program_enrollment_tool.json | 4 +- .../program_enrollment_tool.py | 2 +- .../test_program_enrollment_tool.js | 23 + .../test_program_enrollment_tool.py | 10 + .../__init__.py | 0 .../program_enrollment_tool_student.json | 4 +- .../program_enrollment_tool_student.py | 0 .../doctype/program_fee}/__init__.py | 0 .../doctype/program_fee/program_fee.json | 4 +- .../doctype/program_fee/program_fee.py | 0 .../doctype/room}/__init__.py | 0 .../doctype/room/room.js | 0 .../doctype/room/room.json | 4 +- .../doctype/room/room.py | 0 .../doctype/room/test_records.json | 0 .../doctype/room/test_room.js | 4 +- .../doctype/room/test_room.py | 0 .../doctype/school_house}/__init__.py | 0 .../doctype/school_house/school_house.js | 0 .../doctype/school_house/school_house.json | 4 +- .../doctype/school_house/school_house.py | 0 .../doctype/school_house/test_school_house.js | 23 + .../doctype/school_house/test_school_house.py | 0 .../doctype/student/__init__.py | 0 .../doctype/student/student.js | 0 .../doctype/student/student.json | 4 +- .../doctype/student/student.py | 0 .../doctype/student/student_dashboard.py | 0 .../doctype/student/student_list.js | 0 .../doctype/student/test_records.json | 0 .../education/doctype/student/test_student.js | 23 + .../doctype/student/test_student.py | 0 .../doctype/student_admission/__init__.py | 0 .../student_admission/student_admission.js | 0 .../student_admission/student_admission.json | 4 +- .../student_admission/student_admission.py | 2 +- .../templates/student_admission.html | 0 .../templates/student_admission_row.html | 0 .../test_student_admission.js | 4 +- .../test_student_admission.py | 0 .../student_admission_program/__init__.py | 0 .../student_admission_program.json | 4 +- .../student_admission_program.py | 0 .../doctype/student_applicant/__init__.py | 0 .../student_applicant/student_applicant.js | 2 +- .../student_applicant/student_applicant.json | 4 +- .../student_applicant/student_applicant.py | 0 .../student_applicant_list.js | 0 .../test_student_applicant.py | 0 .../tests/test_student_applicant.js | 4 +- .../test_student_applicant_dummy_data.js | 0 .../tests/test_student_applicant_options.js | 4 +- .../doctype/student_attendance/__init__.py | 0 .../student_attendance/student_attendance.js | 0 .../student_attendance.json | 4 +- .../student_attendance/student_attendance.py | 2 +- .../student_attendance_list.js | 0 .../test_student_attendance.js | 4 +- .../test_student_attendance.py | 0 .../student_attendance_tool/__init__.py | 0 .../student_attendance_tool.js | 10 +- .../student_attendance_tool.json | 4 +- .../student_attendance_tool.py | 0 .../test_student_attendance_tool.js | 4 +- .../test_student_attendance_tool.py | 10 + .../doctype/student_batch_name/__init__.py | 0 .../student_batch_name/student_batch_name.js | 0 .../student_batch_name.json | 4 +- .../student_batch_name/student_batch_name.py | 0 .../student_batch_name/test_records.json | 0 .../test_student_batch_name.js | 4 +- .../test_student_batch_name.py | 0 .../doctype/student_category/__init__.py | 0 .../student_category/student_category.js | 0 .../student_category/student_category.json | 4 +- .../student_category/student_category.py | 0 .../student_category/test_student_category.js | 4 +- .../student_category/test_student_category.py | 0 .../doctype/student_group/__init__.py | 0 .../doctype/student_group/student_group.js | 6 +- .../doctype/student_group/student_group.json | 4 +- .../doctype/student_group/student_group.py | 2 +- .../doctype/student_group/test_records.json | 0 .../student_group/test_student_group.js | 4 +- .../student_group/test_student_group.py | 0 .../student_group_creation_tool/__init__.py | 0 .../student_group_creation_tool.js | 0 .../student_group_creation_tool.json | 4 +- .../student_group_creation_tool.py | 2 +- .../test_student_group_creation_tool.js | 2 +- .../test_student_group_creation_tool.py | 10 + .../__init__.py | 0 .../student_group_creation_tool_course.json | 4 +- .../student_group_creation_tool_course.py | 0 .../student_group_instructor/__init__.py | 0 .../student_group_instructor.json | 7 +- .../student_group_instructor.py | 0 .../doctype/student_group_student/__init__.py | 0 .../student_group_student.json | 9 +- .../student_group_student.py | 0 .../doctype/student_guardian/__init__.py | 0 .../student_guardian/student_guardian.json | 10 +- .../student_guardian/student_guardian.py | 0 .../doctype/student_language/__init__.py | 0 .../student_language/student_language.js | 0 .../student_language/student_language.json | 10 +- .../student_language/student_language.py | 0 .../student_language/test_student_language.js | 23 + .../student_language/test_student_language.py | 0 .../student_leave_application/__init__.py | 0 .../student_leave_application.js | 0 .../student_leave_application.json | 357 ++++++++++++++++ .../student_leave_application.py | 0 .../test_student_leave_application.js | 4 +- .../test_student_leave_application.py | 0 .../doctype/student_log/__init__.py | 0 .../doctype/student_log/student_log.js | 0 .../doctype/student_log/student_log.json | 400 ++++++++++++++++++ .../doctype/student_log/student_log.py | 0 .../doctype/student_log/test_student_log.js | 4 +- .../doctype/student_log/test_student_log.py | 0 .../doctype/student_sibling/__init__.py | 0 .../student_sibling/student_sibling.json | 12 +- .../student_sibling/student_sibling.py | 0 .../doctype/student_siblings/__init__.py | 0 .../student_siblings/student_siblings.json | 21 +- .../student_siblings/student_siblings.py | 0 .../{schools => education}/report/__init__.py | 0 .../report/absent_student_report/__init__.py | 0 .../absent_student_report.js | 0 .../absent_student_report.json | 4 +- .../absent_student_report.py | 0 .../course_wise_assessment_report/__init__.py | 0 .../course_wise_assessment_report.html | 0 .../course_wise_assessment_report.js | 0 .../course_wise_assessment_report.json | 4 +- .../course_wise_assessment_report.py | 2 +- .../__init__.py | 0 .../student_and_guardian_contact_details.js | 0 .../student_and_guardian_contact_details.json | 4 +- .../student_and_guardian_contact_details.py | 0 .../student_batch_wise_attendance/__init__.py | 0 .../student_batch_wise_attendance.js | 0 .../student_batch_wise_attendance.json | 4 +- .../student_batch_wise_attendance.py | 0 .../report/student_fee_collection/__init__.py | 0 .../student_fee_collection.json | 4 +- .../__init__.py | 0 .../student_monthly_attendance_sheet.js | 2 +- .../student_monthly_attendance_sheet.json | 4 +- .../student_monthly_attendance_sheet.py | 2 +- erpnext/education/setup.py | 28 ++ erpnext/{schools => education}/utils.py | 0 .../web_form/__init__.py | 0 .../web_form/student_applicant}/__init__.py | 0 .../student_applicant/student_applicant.js | 0 .../student_applicant/student_applicant.json | 4 +- .../student_applicant/student_applicant.py | 0 erpnext/healthcare/setup.py | 15 +- erpnext/modules.txt | 2 +- erpnext/patches.txt | 3 +- .../v10_0}/__init__.py | 0 .../v10_0/rename_schools_to_education.py | 32 ++ erpnext/patches/v7_0/make_guardian.py | 12 +- .../v7_0/migrate_schools_to_erpnext.py | 13 +- .../v7_0/rename_examination_to_assessment.py | 10 +- erpnext/patches/v7_0/set_portal_settings.py | 4 +- erpnext/patches/v7_1/set_student_guardian.py | 12 +- erpnext/patches/v7_2/mark_students_active.py | 7 +- .../v7_2/rename_evaluation_criteria.py | 21 +- .../patches/v7_2/update_assessment_modules.py | 17 +- .../update_guardian_name_in_student_master.py | 14 +- .../merge_student_batch_and_student_group.py | 5 +- .../patches/v9_0/copy_old_fees_field_data.py | 4 +- .../student_admission_childtable_migrate.py | 7 +- erpnext/public/build.json | 6 +- erpnext/public/js/setup_wizard.js | 2 +- .../student_leave_application.json | 357 ---------------- .../doctype/student_log/student_log.json | 400 ------------------ .../schools/web_form/discussion/discussion.js | 4 - .../web_form/discussion/discussion.json | 49 --- .../schools/web_form/discussion/discussion.py | 9 - erpnext/setup/setup_wizard/sample_data.py | 6 +- ...school_masters.md => education_masters.md} | 2 +- .../setup_wizard/tasks/school_import_data.md | 2 +- erpnext/setup/utils.py | 15 + erpnext/tests/ui/tests.txt | 54 +-- erpnext/utilities/user_progress.py | 4 +- erpnext/utilities/user_progress_utils.py | 2 +- license.txt | 2 +- 558 files changed, 1687 insertions(+), 1349 deletions(-) rename erpnext/config/{schools.py => education.py} (99%) rename erpnext/demo/data/{item_schools.json => item_education.json} (100%) rename erpnext/demo/user/{schools.py => education.py} (93%) rename erpnext/docs/assets/img/{schools => education}/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/admission/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/admission/program-enrollment-tool.gif (100%) rename erpnext/docs/assets/img/{schools => education}/admission/program-enrollment-tool01.gif (100%) rename erpnext/docs/assets/img/{schools => education}/admission/program-enrollment.gif (100%) rename erpnext/docs/assets/img/{schools => education}/admission/student-admission.gif (100%) rename erpnext/docs/assets/img/{schools => education}/admission/student-applicant-enroll.png (100%) rename erpnext/docs/assets/img/{schools => education}/admission/student-applicant.png (100%) rename erpnext/docs/assets/img/{schools => education}/admission/student-application-actions.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-criteria.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-group-details.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-group-term.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-plan-criteria.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-plan-details.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-result-tool.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/assessment-result.png (100%) rename erpnext/docs/assets/img/{schools => education}/assessment/grading-scale.png (100%) rename erpnext/docs/assets/img/{schools => education}/fees/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/fees/fee-category.png (100%) rename erpnext/docs/assets/img/{schools => education}/fees/fee-structure.png (100%) rename erpnext/docs/assets/img/{schools => education}/fees/fees-section.png (100%) rename erpnext/docs/assets/img/{schools => education}/fees/fees.png (100%) rename erpnext/docs/assets/img/{schools => education}/home.png (100%) rename erpnext/docs/assets/img/{schools => education}/module.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/course-schedule-att-1.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/course-schedule-att.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/course-schedule.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/examination.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/schedule-section.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/scheduling-tool.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/student-attendance.gif (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/student-attendance.png (100%) rename erpnext/docs/assets/img/{schools => education}/schedule/student-leave-application.gif (100%) rename erpnext/docs/assets/img/{schools => education}/setup/Course-schedule-error.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/Room-Assesment-plan.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/setup/academic-term.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/academic-year.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/course-fee-program.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/course.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/instructor.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/program.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/room.png (100%) rename erpnext/docs/assets/img/{schools => education}/setup/student-attendance-tool.gif (100%) rename erpnext/docs/assets/img/{schools => education}/setup/student-group-instructor.png (100%) rename erpnext/docs/assets/img/{schools => education}/student/__init__.py (100%) rename erpnext/docs/assets/img/{schools => education}/student/guardian.png (100%) rename erpnext/docs/assets/img/{schools => education}/student/schools-settings.png (100%) rename erpnext/docs/assets/img/{schools => education}/student/student group.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-admission.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-batch-validation.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-batch.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-course-validation.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-group-attendance.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-group-creation-tool.gif (100%) rename erpnext/docs/assets/img/{schools => education}/student/student-log.png (100%) rename erpnext/docs/assets/img/{schools => education}/student/student.png (100%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/assessment_criteria.md (82%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/assessment_criteria_group.md (100%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/assessment_group.md (79%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/assessment_plan.md (81%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/assessment_result.md (68%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/assessment_result_tool.md (89%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/grading_scale.md (83%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/index.md (100%) rename erpnext/docs/user/manual/en/{schools => education}/Assessment/index.txt (100%) rename erpnext/docs/user/manual/en/{schools => education}/Attendance/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/Attendance/index.md (100%) rename erpnext/docs/user/manual/en/{schools => education}/Attendance/index.txt (100%) rename erpnext/docs/user/manual/en/{schools => education}/Attendance/student-attendance-tool.md (87%) rename erpnext/docs/user/manual/en/{schools => education}/Attendance/student-attendance.md (92%) rename erpnext/docs/user/manual/en/{schools => education}/Attendance/student-leave-application.md (63%) rename erpnext/docs/user/manual/en/{schools => education}/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/admission/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/admission/index.md (100%) rename erpnext/docs/user/manual/en/{schools => education}/admission/index.txt (100%) rename erpnext/docs/user/manual/en/{schools => education}/admission/program-enrollment-tool.md (81%) rename erpnext/docs/user/manual/en/{schools => education}/admission/program-enrollment.md (91%) rename erpnext/docs/user/manual/en/{schools => education}/admission/student-applicant.md (86%) rename erpnext/docs/user/manual/en/{schools => education}/admission/student_admission.md (84%) rename erpnext/docs/user/manual/en/{schools => education}/fees/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/fees/fee-category.md (75%) rename erpnext/docs/user/manual/en/{schools => education}/fees/fee-structure.md (78%) create mode 100644 erpnext/docs/user/manual/en/education/fees/fees.md rename erpnext/docs/user/manual/en/{schools => education}/fees/index.md (76%) rename erpnext/docs/user/manual/en/{schools => education}/fees/index.txt (100%) create mode 100644 erpnext/docs/user/manual/en/education/index.md rename erpnext/docs/user/manual/en/{schools => education}/index.txt (100%) rename erpnext/docs/user/manual/en/{schools => education}/schedule/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/schedule/course-schedule.md (84%) rename erpnext/docs/user/manual/en/{schools => education}/schedule/examination.md (80%) rename erpnext/docs/user/manual/en/{schools => education}/schedule/index.md (62%) rename erpnext/docs/user/manual/en/{schools => education}/schedule/index.txt (100%) rename erpnext/docs/user/manual/en/{schools => education}/schedule/scheduling-tool.md (96%) rename erpnext/docs/user/manual/en/{schools => education}/setup/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/setup/academic-term.md (92%) rename erpnext/docs/user/manual/en/{schools => education}/setup/academic-year.md (61%) rename erpnext/docs/user/manual/en/{schools => education}/setup/course.md (78%) create mode 100644 erpnext/docs/user/manual/en/education/setup/index.md rename erpnext/docs/user/manual/en/{schools => education}/setup/index.txt (84%) rename erpnext/docs/user/manual/en/{schools => education}/setup/instructor.md (65%) rename erpnext/docs/user/manual/en/{schools => education}/setup/program.md (70%) rename erpnext/docs/user/manual/en/{schools => education}/setup/room.md (72%) create mode 100644 erpnext/docs/user/manual/en/education/setup/school-settings.md rename erpnext/docs/user/manual/en/{schools => education}/setup/student-batch-name.md (80%) rename erpnext/docs/user/manual/en/{schools => education}/setup/student-category.md (78%) rename erpnext/docs/user/manual/en/{schools => education}/student/__init__.py (100%) rename erpnext/docs/user/manual/en/{schools => education}/student/guardian.md (68%) rename erpnext/docs/user/manual/en/{schools => education}/student/index.md (100%) rename erpnext/docs/user/manual/en/{schools => education}/student/index.txt (100%) rename erpnext/docs/user/manual/en/{schools => education}/student/student-batch.md (80%) rename erpnext/docs/user/manual/en/{schools => education}/student/student-group-creation-tool.md (82%) rename erpnext/docs/user/manual/en/{schools => education}/student/student-group.md (88%) rename erpnext/docs/user/manual/en/{schools => education}/student/student-log.md (72%) rename erpnext/docs/user/manual/en/{schools => education}/student/student.md (83%) delete mode 100644 erpnext/docs/user/manual/en/schools/fees/fees.md delete mode 100644 erpnext/docs/user/manual/en/schools/index.md delete mode 100644 erpnext/docs/user/manual/en/schools/setup/index.md delete mode 100644 erpnext/docs/user/manual/en/schools/setup/school-settings.md rename erpnext/docs/user/manual/es/{schools => education}/Assessment/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/assessment_criteria.md (85%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/assessment_group.md (82%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/assessment_plan.md (84%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/assessment_result.md (75%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/assessment_result_tool.md (92%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/grading_scale.md (87%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/index.md (100%) rename erpnext/docs/user/manual/es/{schools => education}/Assessment/index.txt (100%) rename erpnext/docs/user/manual/es/{schools => education}/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/admission/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/admission/index.md (100%) rename erpnext/docs/user/manual/es/{schools => education}/admission/index.txt (100%) rename erpnext/docs/user/manual/es/{schools => education}/admission/program-enrollment.md (78%) rename erpnext/docs/user/manual/es/{schools => education}/admission/student-applicant.md (89%) rename erpnext/docs/user/manual/es/{schools => education}/fees/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/fees/fee-category.md (80%) rename erpnext/docs/user/manual/es/{schools => education}/fees/fee-structure.md (83%) create mode 100644 erpnext/docs/user/manual/es/education/fees/fees.md rename erpnext/docs/user/manual/es/{schools => education}/fees/index.md (82%) rename erpnext/docs/user/manual/es/{schools => education}/fees/index.txt (100%) rename erpnext/docs/user/manual/es/{schools => education}/index.md (84%) rename erpnext/docs/user/manual/es/{schools => education}/index.txt (100%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/course-schedule.md (86%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/examination.md (85%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/index.md (66%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/index.txt (100%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/scheduling-tool.md (96%) rename erpnext/docs/user/manual/es/{schools => education}/schedule/student-attendance.md (83%) rename erpnext/docs/user/manual/es/{schools => education}/setup/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/setup/academic-term.md (71%) rename erpnext/docs/user/manual/es/{schools => education}/setup/academic-year.md (70%) create mode 100644 erpnext/docs/user/manual/es/education/setup/course.md rename erpnext/docs/user/manual/es/{schools => education}/setup/index.md (72%) rename erpnext/docs/user/manual/es/{schools => education}/setup/index.txt (100%) create mode 100644 erpnext/docs/user/manual/es/education/setup/instructor.md create mode 100644 erpnext/docs/user/manual/es/education/setup/program.md create mode 100644 erpnext/docs/user/manual/es/education/setup/room.md rename erpnext/docs/user/manual/es/{schools => education}/student/__init__.py (100%) rename erpnext/docs/user/manual/es/{schools => education}/student/index.md (100%) rename erpnext/docs/user/manual/es/{schools => education}/student/index.txt (100%) rename erpnext/docs/user/manual/es/{schools => education}/student/student-batch.md (55%) rename erpnext/docs/user/manual/es/{schools => education}/student/student-group-creation-tool.md (77%) rename erpnext/docs/user/manual/es/{schools => education}/student/student-group.md (90%) rename erpnext/docs/user/manual/es/{schools => education}/student/student-log.md (71%) rename erpnext/docs/user/manual/es/{schools => education}/student/student.md (78%) delete mode 100644 erpnext/docs/user/manual/es/schools/fees/fees.md delete mode 100644 erpnext/docs/user/manual/es/schools/setup/course.md delete mode 100644 erpnext/docs/user/manual/es/schools/setup/instructor.md delete mode 100644 erpnext/docs/user/manual/es/schools/setup/program.md delete mode 100644 erpnext/docs/user/manual/es/schools/setup/room.md create mode 100644 erpnext/docs/user/videos/learn/education.md delete mode 100644 erpnext/docs/user/videos/learn/schools.md rename erpnext/{schools => education}/__init__.py (100%) rename erpnext/{schools => education}/api.py (100%) rename erpnext/{schools => education}/doctype/__init__.py (100%) rename erpnext/{schools => education}/doctype/academic_term/__init__.py (100%) rename erpnext/{schools => education}/doctype/academic_term/academic_term.js (100%) rename erpnext/{schools => education}/doctype/academic_term/academic_term.json (98%) rename erpnext/{schools => education}/doctype/academic_term/academic_term.py (100%) rename erpnext/{schools => education}/doctype/academic_term/test_academic_term.js (89%) rename erpnext/{schools => education}/doctype/academic_term/test_academic_term.py (100%) rename erpnext/{schools => education}/doctype/academic_term/test_records.json (100%) rename erpnext/{schools => education}/doctype/academic_year/__init__.py (100%) rename erpnext/{schools => education}/doctype/academic_year/academic_year.js (100%) rename erpnext/{schools => education}/doctype/academic_year/academic_year.json (97%) rename erpnext/{schools => education}/doctype/academic_year/academic_year.py (100%) rename erpnext/{schools => education}/doctype/academic_year/test_academic_year.js (88%) rename erpnext/{schools => education}/doctype/academic_year/test_academic_year.py (100%) rename erpnext/{schools => education}/doctype/academic_year/test_records.json (100%) rename erpnext/{schools => education}/doctype/assessment_criteria/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_criteria/assessment_criteria.js (100%) rename erpnext/{schools => education}/doctype/assessment_criteria/assessment_criteria.json (97%) rename erpnext/{schools => education}/doctype/assessment_criteria/assessment_criteria.py (100%) rename erpnext/{schools => education}/doctype/assessment_criteria/test_assessment_criteria.js (83%) rename erpnext/{schools => education}/doctype/assessment_criteria/test_assessment_criteria.py (100%) rename erpnext/{schools => education}/doctype/assessment_criteria/test_records.json (100%) rename erpnext/{schools => education}/doctype/assessment_criteria_group/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_criteria_group/assessment_criteria_group.js (100%) rename erpnext/{schools => education}/doctype/assessment_criteria_group/assessment_criteria_group.json (96%) rename erpnext/{schools => education}/doctype/assessment_criteria_group/assessment_criteria_group.py (100%) rename erpnext/{schools => education}/doctype/assessment_criteria_group/test_assessment_criteria_group.js (82%) rename erpnext/{schools => education}/doctype/assessment_criteria_group/test_assessment_criteria_group.py (100%) rename erpnext/{schools => education}/doctype/assessment_group/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_group/assessment_group.js (100%) rename erpnext/{schools => education}/doctype/assessment_group/assessment_group.json (98%) rename erpnext/{schools => education}/doctype/assessment_group/assessment_group.py (100%) rename erpnext/{schools => education}/doctype/assessment_group/assessment_group_tree.js (100%) rename erpnext/{schools => education}/doctype/assessment_group/test_assessment_group.js (98%) rename erpnext/{schools => education}/doctype/assessment_group/test_assessment_group.py (100%) rename erpnext/{schools => education}/doctype/assessment_plan/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_plan/assessment_plan.js (96%) rename erpnext/{schools => education}/doctype/assessment_plan/assessment_plan.json (99%) rename erpnext/{schools => education}/doctype/assessment_plan/assessment_plan.py (97%) rename erpnext/{schools => education}/doctype/assessment_plan/test_assessment_plan.js (96%) rename erpnext/{schools => education}/doctype/assessment_plan/test_assessment_plan.py (100%) rename erpnext/{schools => education}/doctype/assessment_plan_criteria/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_plan_criteria/assessment_plan_criteria.json (97%) rename erpnext/{schools => education}/doctype/assessment_plan_criteria/assessment_plan_criteria.py (100%) rename erpnext/{schools => education}/doctype/assessment_result/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_result/assessment_result.js (92%) rename erpnext/{schools => education}/doctype/assessment_result/assessment_result.json (99%) rename erpnext/{schools => education}/doctype/assessment_result/assessment_result.py (94%) rename erpnext/{schools => education}/doctype/assessment_result/test_assessment_result.js (95%) rename erpnext/{schools => education}/doctype/assessment_result/test_assessment_result.py (91%) rename erpnext/{schools => education}/doctype/assessment_result_detail/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_result_detail/assessment_result_detail.json (98%) rename erpnext/{schools => education}/doctype/assessment_result_detail/assessment_result_detail.py (100%) rename erpnext/{schools => education}/doctype/assessment_result_tool/__init__.py (100%) rename erpnext/{schools => education}/doctype/assessment_result_tool/assessment_result_tool.js (94%) rename erpnext/{schools => education}/doctype/assessment_result_tool/assessment_result_tool.json (98%) rename erpnext/{schools => education}/doctype/assessment_result_tool/assessment_result_tool.py (100%) rename erpnext/{schools => education}/doctype/assessment_result_tool/test_assessment_result_tool.js (93%) create mode 100644 erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py rename erpnext/{schools => education}/doctype/course/__init__.py (100%) rename erpnext/{schools => education}/doctype/course/course.js (100%) rename erpnext/{schools => education}/doctype/course/course.json (99%) rename erpnext/{schools => education}/doctype/course/course.py (100%) rename erpnext/{schools => education}/doctype/course/test_course.js (94%) rename erpnext/{schools => education}/doctype/course/test_course.py (100%) rename erpnext/{schools => education}/doctype/course/test_records.json (100%) rename erpnext/{schools => education}/doctype/course_assessment_criteria/__init__.py (100%) rename erpnext/{schools => education}/doctype/course_assessment_criteria/course_assessment_criteria.json (97%) rename erpnext/{schools => education}/doctype/course_assessment_criteria/course_assessment_criteria.py (100%) rename erpnext/{schools => education}/doctype/course_schedule/__init__.py (100%) rename erpnext/{schools => education}/doctype/course_schedule/course_schedule.js (92%) rename erpnext/{schools => education}/doctype/course_schedule/course_schedule.json (99%) rename erpnext/{schools => education}/doctype/course_schedule/course_schedule.py (96%) rename erpnext/{schools => education}/doctype/course_schedule/course_schedule_calendar.js (91%) create mode 100644 erpnext/education/doctype/course_schedule/test_course_schedule.js rename erpnext/{schools => education}/doctype/course_schedule/test_course_schedule.py (98%) rename erpnext/{schools => education}/doctype/course_scheduling_tool/__init__.py (100%) rename erpnext/{schools => education}/doctype/course_scheduling_tool/course_scheduling_tool.js (100%) rename erpnext/{schools => education}/doctype/course_scheduling_tool/course_scheduling_tool.json (99%) rename erpnext/{schools => education}/doctype/course_scheduling_tool/course_scheduling_tool.py (98%) create mode 100644 erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.js create mode 100644 erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py rename erpnext/{schools/doctype/fee_category => education/doctype/education_settings}/__init__.py (100%) rename erpnext/{schools/doctype/school_settings/school_settings.js => education/doctype/education_settings/education_settings.js} (78%) rename erpnext/{schools/doctype/school_settings/school_settings.json => education/doctype/education_settings/education_settings.json} (98%) rename erpnext/{schools/doctype/school_settings/school_settings.py => education/doctype/education_settings/education_settings.py} (85%) rename erpnext/{schools/doctype/school_settings/test_school_settings.js => education/doctype/education_settings/test_education_settings.js} (64%) create mode 100644 erpnext/education/doctype/education_settings/test_education_settings.py rename erpnext/{schools/doctype/fee_component => education/doctype/fee_category}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fee_category/fee_category.js (100%) rename erpnext/{schools => education}/doctype/fee_category/fee_category.json (98%) rename erpnext/{schools => education}/doctype/fee_category/fee_category.py (100%) create mode 100644 erpnext/education/doctype/fee_category/test_fee_category.js rename erpnext/{schools => education}/doctype/fee_category/test_fee_category.py (100%) rename erpnext/{schools => education}/doctype/fee_category/test_records.json (100%) rename erpnext/{schools/doctype/fee_schedule => education/doctype/fee_component}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fee_component/fee_component.json (98%) rename erpnext/{schools => education}/doctype/fee_component/fee_component.py (100%) rename erpnext/{schools/doctype/fee_schedule_program => education/doctype/fee_schedule}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fee_schedule/fee_schedule.js (95%) rename erpnext/{schools => education}/doctype/fee_schedule/fee_schedule.json (99%) rename erpnext/{schools => education}/doctype/fee_schedule/fee_schedule.py (100%) rename erpnext/{schools => education}/doctype/fee_schedule/fee_schedule_list.js (100%) rename erpnext/{schools => education}/doctype/fee_schedule/test_fee_schedule.js (100%) rename erpnext/{schools => education}/doctype/fee_schedule/test_fee_schedule.py (100%) rename erpnext/{schools/doctype/fee_schedule_student_group => education/doctype/fee_schedule_program}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fee_schedule_program/fee_schedule_program.json (97%) rename erpnext/{schools => education}/doctype/fee_schedule_program/fee_schedule_program.py (100%) rename erpnext/{schools/doctype/fee_structure => education/doctype/fee_schedule_student_group}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fee_schedule_student_group/fee_schedule_student_group.json (96%) rename erpnext/{schools => education}/doctype/fee_schedule_student_group/fee_schedule_student_group.py (100%) rename erpnext/{schools/doctype/fees => education/doctype/fee_structure}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fee_structure/fee_structure.js (93%) rename erpnext/{schools => education}/doctype/fee_structure/fee_structure.json (99%) rename erpnext/{schools => education}/doctype/fee_structure/fee_structure.py (100%) rename erpnext/{schools => education}/doctype/fee_structure/test_fee_structure.js (100%) rename erpnext/{schools => education}/doctype/fee_structure/test_fee_structure.py (100%) rename erpnext/{schools => education}/doctype/fee_structure/test_records.json (100%) rename erpnext/{schools/doctype/grading_scale => education/doctype/fees}/__init__.py (100%) rename erpnext/{schools => education}/doctype/fees/fees.js (97%) rename erpnext/{schools => education}/doctype/fees/fees.json (99%) rename erpnext/{schools => education}/doctype/fees/fees.py (100%) rename erpnext/{schools => education}/doctype/fees/fees_list.js (100%) rename erpnext/{schools => education}/doctype/fees/test_fees.js (100%) rename erpnext/{schools => education}/doctype/fees/test_fees.py (100%) rename erpnext/{schools/doctype/grading_scale_interval => education/doctype/grading_scale}/__init__.py (100%) rename erpnext/{schools => education}/doctype/grading_scale/grading_scale.js (100%) rename erpnext/{schools => education}/doctype/grading_scale/grading_scale.json (98%) rename erpnext/{schools => education}/doctype/grading_scale/grading_scale.py (100%) rename erpnext/{schools => education}/doctype/grading_scale/test_grading_scale.js (97%) rename erpnext/{schools => education}/doctype/grading_scale/test_grading_scale.py (100%) rename erpnext/{schools => education}/doctype/grading_scale/test_records.json (100%) rename erpnext/{schools/doctype/guardian => education/doctype/grading_scale_interval}/__init__.py (100%) rename erpnext/{schools => education}/doctype/grading_scale_interval/grading_scale_interval.json (97%) rename erpnext/{schools => education}/doctype/grading_scale_interval/grading_scale_interval.py (100%) rename erpnext/{schools/doctype/guardian_interest => education/doctype/guardian}/__init__.py (100%) rename erpnext/{schools => education}/doctype/guardian/guardian.js (100%) rename erpnext/{schools => education}/doctype/guardian/guardian.json (99%) rename erpnext/{schools => education}/doctype/guardian/guardian.py (100%) rename erpnext/{schools => education}/doctype/guardian/test_guardian.js (93%) rename erpnext/{schools => education}/doctype/guardian/test_guardian.py (100%) rename erpnext/{schools/doctype/guardian_student => education/doctype/guardian_interest}/__init__.py (100%) rename erpnext/{schools => education}/doctype/guardian_interest/guardian_interest.json (95%) rename erpnext/{schools => education}/doctype/guardian_interest/guardian_interest.py (100%) rename erpnext/{schools/doctype/instructor => education/doctype/guardian_student}/__init__.py (100%) rename erpnext/{schools => education}/doctype/guardian_student/guardian_student.json (97%) rename erpnext/{schools => education}/doctype/guardian_student/guardian_student.py (100%) rename erpnext/{schools/doctype/program => education/doctype/instructor}/__init__.py (100%) rename erpnext/{schools => education}/doctype/instructor/instructor.js (100%) rename erpnext/{schools => education}/doctype/instructor/instructor.json (98%) rename erpnext/{schools => education}/doctype/instructor/instructor.py (79%) rename erpnext/{schools => education}/doctype/instructor/test_instructor.js (86%) rename erpnext/{schools => education}/doctype/instructor/test_instructor.py (100%) rename erpnext/{schools => education}/doctype/instructor/test_records.json (100%) rename erpnext/{schools/doctype/program_course => education/doctype/program}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program/program.js (100%) rename erpnext/{schools => education}/doctype/program/program.json (98%) rename erpnext/{schools => education}/doctype/program/program.py (100%) rename erpnext/{schools => education}/doctype/program/test_program.js (92%) rename erpnext/{schools => education}/doctype/program/test_program.py (100%) rename erpnext/{schools => education}/doctype/program/test_records.json (100%) rename erpnext/{schools/doctype/program_enrollment => education/doctype/program_course}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_course/program_course.json (98%) rename erpnext/{schools => education}/doctype/program_course/program_course.py (100%) rename erpnext/{schools/doctype/program_enrollment_course => education/doctype/program_enrollment}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_enrollment/program_enrollment.js (87%) rename erpnext/{schools => education}/doctype/program_enrollment/program_enrollment.json (98%) rename erpnext/{schools => education}/doctype/program_enrollment/program_enrollment.py (98%) create mode 100644 erpnext/education/doctype/program_enrollment/test_program_enrollment.js rename erpnext/{schools => education}/doctype/program_enrollment/test_program_enrollment.py (100%) rename erpnext/{schools/doctype/program_enrollment_fee => education/doctype/program_enrollment_course}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_enrollment_course/program_enrollment_course.json (96%) rename erpnext/{schools => education}/doctype/program_enrollment_course/program_enrollment_course.py (100%) rename erpnext/{schools/doctype/program_enrollment_tool => education/doctype/program_enrollment_fee}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_enrollment_fee/program_enrollment_fee.json (98%) rename erpnext/{schools => education}/doctype/program_enrollment_fee/program_enrollment_fee.py (100%) rename erpnext/{schools/doctype/program_enrollment_tool_student => education/doctype/program_enrollment_tool}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_enrollment_tool/program_enrollment_tool.js (100%) rename erpnext/{schools => education}/doctype/program_enrollment_tool/program_enrollment_tool.json (99%) rename erpnext/{schools => education}/doctype/program_enrollment_tool/program_enrollment_tool.py (97%) create mode 100644 erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.js create mode 100644 erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py rename erpnext/{schools/doctype/program_fee => education/doctype/program_enrollment_tool_student}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json (98%) rename erpnext/{schools => education}/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py (100%) rename erpnext/{schools/doctype/room => education/doctype/program_fee}/__init__.py (100%) rename erpnext/{schools => education}/doctype/program_fee/program_fee.json (98%) rename erpnext/{schools => education}/doctype/program_fee/program_fee.py (100%) rename erpnext/{schools/doctype/school_house => education/doctype/room}/__init__.py (100%) rename erpnext/{schools => education}/doctype/room/room.js (100%) rename erpnext/{schools => education}/doctype/room/room.json (97%) rename erpnext/{schools => education}/doctype/room/room.py (100%) rename erpnext/{schools => education}/doctype/room/test_records.json (100%) rename erpnext/{schools => education}/doctype/room/test_room.js (87%) rename erpnext/{schools => education}/doctype/room/test_room.py (100%) rename erpnext/{schools/doctype/school_settings => education/doctype/school_house}/__init__.py (100%) rename erpnext/{schools => education}/doctype/school_house/school_house.js (100%) rename erpnext/{schools => education}/doctype/school_house/school_house.json (96%) rename erpnext/{schools => education}/doctype/school_house/school_house.py (100%) create mode 100644 erpnext/education/doctype/school_house/test_school_house.js rename erpnext/{schools => education}/doctype/school_house/test_school_house.py (100%) rename erpnext/{schools => education}/doctype/student/__init__.py (100%) rename erpnext/{schools => education}/doctype/student/student.js (100%) rename erpnext/{schools => education}/doctype/student/student.json (99%) rename erpnext/{schools => education}/doctype/student/student.py (100%) rename erpnext/{schools => education}/doctype/student/student_dashboard.py (100%) rename erpnext/{schools => education}/doctype/student/student_list.js (100%) rename erpnext/{schools => education}/doctype/student/test_records.json (100%) create mode 100644 erpnext/education/doctype/student/test_student.js rename erpnext/{schools => education}/doctype/student/test_student.py (100%) rename erpnext/{schools => education}/doctype/student_admission/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_admission/student_admission.js (100%) rename erpnext/{schools => education}/doctype/student_admission/student_admission.json (99%) rename erpnext/{schools => education}/doctype/student_admission/student_admission.py (93%) rename erpnext/{schools => education}/doctype/student_admission/templates/student_admission.html (100%) rename erpnext/{schools => education}/doctype/student_admission/templates/student_admission_row.html (100%) rename erpnext/{schools => education}/doctype/student_admission/test_student_admission.js (95%) rename erpnext/{schools => education}/doctype/student_admission/test_student_admission.py (100%) rename erpnext/{schools => education}/doctype/student_admission_program/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_admission_program/student_admission_program.json (98%) rename erpnext/{schools => education}/doctype/student_admission_program/student_admission_program.py (100%) rename erpnext/{schools => education}/doctype/student_applicant/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_applicant/student_applicant.js (96%) rename erpnext/{schools => education}/doctype/student_applicant/student_applicant.json (99%) rename erpnext/{schools => education}/doctype/student_applicant/student_applicant.py (100%) rename erpnext/{schools => education}/doctype/student_applicant/student_applicant_list.js (100%) rename erpnext/{schools => education}/doctype/student_applicant/test_student_applicant.py (100%) rename erpnext/{schools => education}/doctype/student_applicant/tests/test_student_applicant.js (98%) rename erpnext/{schools => education}/doctype/student_applicant/tests/test_student_applicant_dummy_data.js (100%) rename erpnext/{schools => education}/doctype/student_applicant/tests/test_student_applicant_options.js (98%) rename erpnext/{schools => education}/doctype/student_attendance/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_attendance/student_attendance.js (100%) rename erpnext/{schools => education}/doctype/student_attendance/student_attendance.json (98%) rename erpnext/{schools => education}/doctype/student_attendance/student_attendance.py (97%) rename erpnext/{schools => education}/doctype/student_attendance/student_attendance_list.js (100%) rename erpnext/{schools => education}/doctype/student_attendance/test_student_attendance.js (92%) rename erpnext/{schools => education}/doctype/student_attendance/test_student_attendance.py (100%) rename erpnext/{schools => education}/doctype/student_attendance_tool/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_attendance_tool/student_attendance_tool.js (93%) rename erpnext/{schools => education}/doctype/student_attendance_tool/student_attendance_tool.json (99%) rename erpnext/{schools => education}/doctype/student_attendance_tool/student_attendance_tool.py (100%) rename erpnext/{schools => education}/doctype/student_attendance_tool/test_student_attendance_tool.js (97%) create mode 100644 erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py rename erpnext/{schools => education}/doctype/student_batch_name/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_batch_name/student_batch_name.js (100%) rename erpnext/{schools => education}/doctype/student_batch_name/student_batch_name.json (96%) rename erpnext/{schools => education}/doctype/student_batch_name/student_batch_name.py (100%) rename erpnext/{schools => education}/doctype/student_batch_name/test_records.json (100%) rename erpnext/{schools => education}/doctype/student_batch_name/test_student_batch_name.js (83%) rename erpnext/{schools => education}/doctype/student_batch_name/test_student_batch_name.py (100%) rename erpnext/{schools => education}/doctype/student_category/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_category/student_category.js (100%) rename erpnext/{schools => education}/doctype/student_category/student_category.json (96%) rename erpnext/{schools => education}/doctype/student_category/student_category.py (100%) rename erpnext/{schools => education}/doctype/student_category/test_student_category.js (84%) rename erpnext/{schools => education}/doctype/student_category/test_student_category.py (100%) rename erpnext/{schools => education}/doctype/student_group/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_group/student_group.js (93%) rename erpnext/{schools => education}/doctype/student_group/student_group.json (99%) rename erpnext/{schools => education}/doctype/student_group/student_group.py (98%) rename erpnext/{schools => education}/doctype/student_group/test_records.json (100%) rename erpnext/{schools => education}/doctype/student_group/test_student_group.js (95%) rename erpnext/{schools => education}/doctype/student_group/test_student_group.py (100%) rename erpnext/{schools => education}/doctype/student_group_creation_tool/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_group_creation_tool/student_group_creation_tool.js (100%) rename erpnext/{schools => education}/doctype/student_group_creation_tool/student_group_creation_tool.json (98%) rename erpnext/{schools => education}/doctype/student_group_creation_tool/student_group_creation_tool.py (95%) rename erpnext/{schools => education}/doctype/student_group_creation_tool/test_student_group_creation_tool.js (98%) create mode 100644 erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py rename erpnext/{schools => education}/doctype/student_group_creation_tool_course/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json (98%) rename erpnext/{schools => education}/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py (100%) rename erpnext/{schools => education}/doctype/student_group_instructor/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_group_instructor/student_group_instructor.json (94%) rename erpnext/{schools => education}/doctype/student_group_instructor/student_group_instructor.py (100%) rename erpnext/{schools => education}/doctype/student_group_student/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_group_student/student_group_student.json (95%) rename erpnext/{schools => education}/doctype/student_group_student/student_group_student.py (100%) rename erpnext/{schools => education}/doctype/student_guardian/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_guardian/student_guardian.json (93%) rename erpnext/{schools => education}/doctype/student_guardian/student_guardian.py (100%) rename erpnext/{schools => education}/doctype/student_language/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_language/student_language.js (100%) rename erpnext/{schools => education}/doctype/student_language/student_language.json (91%) rename erpnext/{schools => education}/doctype/student_language/student_language.py (100%) create mode 100644 erpnext/education/doctype/student_language/test_student_language.js rename erpnext/{schools => education}/doctype/student_language/test_student_language.py (100%) rename erpnext/{schools => education}/doctype/student_leave_application/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_leave_application/student_leave_application.js (100%) create mode 100644 erpnext/education/doctype/student_leave_application/student_leave_application.json rename erpnext/{schools => education}/doctype/student_leave_application/student_leave_application.py (100%) rename erpnext/{schools => education}/doctype/student_leave_application/test_student_leave_application.js (96%) rename erpnext/{schools => education}/doctype/student_leave_application/test_student_leave_application.py (100%) rename erpnext/{schools => education}/doctype/student_log/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_log/student_log.js (100%) create mode 100644 erpnext/education/doctype/student_log/student_log.json rename erpnext/{schools => education}/doctype/student_log/student_log.py (100%) rename erpnext/{schools => education}/doctype/student_log/test_student_log.js (94%) rename erpnext/{schools => education}/doctype/student_log/test_student_log.py (100%) rename erpnext/{schools => education}/doctype/student_sibling/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_sibling/student_sibling.json (95%) rename erpnext/{schools => education}/doctype/student_sibling/student_sibling.py (100%) rename erpnext/{schools => education}/doctype/student_siblings/__init__.py (100%) rename erpnext/{schools => education}/doctype/student_siblings/student_siblings.json (81%) rename erpnext/{schools => education}/doctype/student_siblings/student_siblings.py (100%) rename erpnext/{schools => education}/report/__init__.py (100%) rename erpnext/{schools => education}/report/absent_student_report/__init__.py (100%) rename erpnext/{schools => education}/report/absent_student_report/absent_student_report.js (100%) rename erpnext/{schools => education}/report/absent_student_report/absent_student_report.json (86%) rename erpnext/{schools => education}/report/absent_student_report/absent_student_report.py (100%) rename erpnext/{schools => education}/report/course_wise_assessment_report/__init__.py (100%) rename erpnext/{schools => education}/report/course_wise_assessment_report/course_wise_assessment_report.html (100%) rename erpnext/{schools => education}/report/course_wise_assessment_report/course_wise_assessment_report.js (100%) rename erpnext/{schools => education}/report/course_wise_assessment_report/course_wise_assessment_report.json (87%) rename erpnext/{schools => education}/report/course_wise_assessment_report/course_wise_assessment_report.py (99%) rename erpnext/{schools => education}/report/student_and_guardian_contact_details/__init__.py (100%) rename erpnext/{schools => education}/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js (100%) rename erpnext/{schools => education}/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json (88%) rename erpnext/{schools => education}/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py (100%) rename erpnext/{schools => education}/report/student_batch_wise_attendance/__init__.py (100%) rename erpnext/{schools => education}/report/student_batch_wise_attendance/student_batch_wise_attendance.js (100%) rename erpnext/{schools => education}/report/student_batch_wise_attendance/student_batch_wise_attendance.json (87%) rename erpnext/{schools => education}/report/student_batch_wise_attendance/student_batch_wise_attendance.py (100%) rename erpnext/{schools => education}/report/student_fee_collection/__init__.py (100%) rename erpnext/{schools => education}/report/student_fee_collection/student_fee_collection.json (91%) rename erpnext/{schools => education}/report/student_monthly_attendance_sheet/__init__.py (100%) rename erpnext/{schools => education}/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js (89%) rename erpnext/{schools => education}/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json (87%) rename erpnext/{schools => education}/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py (98%) create mode 100644 erpnext/education/setup.py rename erpnext/{schools => education}/utils.py (100%) rename erpnext/{schools => education}/web_form/__init__.py (100%) rename erpnext/{schools/web_form/discussion => education/web_form/student_applicant}/__init__.py (100%) rename erpnext/{schools => education}/web_form/student_applicant/student_applicant.js (100%) rename erpnext/{schools => education}/web_form/student_applicant/student_applicant.json (98%) rename erpnext/{schools => education}/web_form/student_applicant/student_applicant.py (100%) rename erpnext/{schools/web_form/student_applicant => patches/v10_0}/__init__.py (100%) create mode 100644 erpnext/patches/v10_0/rename_schools_to_education.py delete mode 100644 erpnext/schools/doctype/student_leave_application/student_leave_application.json delete mode 100644 erpnext/schools/doctype/student_log/student_log.json delete mode 100644 erpnext/schools/web_form/discussion/discussion.js delete mode 100644 erpnext/schools/web_form/discussion/discussion.json delete mode 100644 erpnext/schools/web_form/discussion/discussion.py rename erpnext/setup/setup_wizard/tasks/{school_masters.md => education_masters.md} (75%) diff --git a/.eslintrc b/.eslintrc index 4dd12168534..c9a1b0365bf 100644 --- a/.eslintrc +++ b/.eslintrc @@ -52,6 +52,7 @@ "frappe": true, "erpnext": true, "schools": true, + "education": true, "$": true, "jQuery": true, diff --git a/erpnext/config/desktop.py b/erpnext/config/desktop.py index ce6c0c3f43f..f30860a3e2b 100644 --- a/erpnext/config/desktop.py +++ b/erpnext/config/desktop.py @@ -194,12 +194,12 @@ def get_data(): "type": "list" }, { - "module_name": "Student Attendance", - "color": "#3aacba", + "module_name": "Student Attendance Tool", + "color": "#C0392B", "icon": "octicon octicon-checklist", - "label": _("Student Attendance"), - "link": "List/Student Attendance", - "_doctype": "Student Attendance", + "label": _("Student Attendance Tool"), + "link": "List/Student Attendance Tool", + "_doctype": "Student Attendance Tool", "type": "list" }, { @@ -257,11 +257,11 @@ def get_data(): "type": "list" }, { - "module_name": "Schools", - "color": "#DE2B37", + "module_name": "Education", + "color": "#428B46", "icon": "octicon octicon-mortar-board", "type": "module", - "label": _("Schools") + "label": _("Education") }, { "module_name": "Healthcare", diff --git a/erpnext/config/schools.py b/erpnext/config/education.py similarity index 99% rename from erpnext/config/schools.py rename to erpnext/config/education.py index 1e7d1b035bb..08846a202a7 100644 --- a/erpnext/config/schools.py +++ b/erpnext/config/education.py @@ -217,7 +217,7 @@ def get_data(): }, { "type": "doctype", - "name": "School Settings" + "name": "Education Settings" } ] }, diff --git a/erpnext/demo/data/item_schools.json b/erpnext/demo/data/item_education.json similarity index 100% rename from erpnext/demo/data/item_schools.json rename to erpnext/demo/data/item_education.json diff --git a/erpnext/demo/demo.py b/erpnext/demo/demo.py index 35256b580fa..42ef8963bc9 100644 --- a/erpnext/demo/demo.py +++ b/erpnext/demo/demo.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe, sys import erpnext import frappe.utils -from erpnext.demo.user import hr, sales, purchase, manufacturing, stock, accounts, projects, fixed_asset, schools +from erpnext.demo.user import hr, sales, purchase, manufacturing, stock, accounts, projects, fixed_asset, education from erpnext.demo.setup import education, manufacture, setup_data, healthcare """ Make a demo @@ -83,7 +83,7 @@ def simulate(domain='Manufacturing', days=100): sales.work() manufacturing.work() elif domain=='Education': - schools.work() + education.work() except: frappe.db.set_global('demo_last_date', current_date) diff --git a/erpnext/demo/setup/education.py b/erpnext/demo/setup/education.py index a124ee7b643..2a894f79d10 100644 --- a/erpnext/demo/setup/education.py +++ b/erpnext/demo/setup/education.py @@ -31,7 +31,7 @@ def make_masters(): frappe.db.commit() def setup_item(): - items = json.loads(open(frappe.get_app_path('erpnext', 'demo', 'data', 'item_schools.json')).read()) + items = json.loads(open(frappe.get_app_path('erpnext', 'demo', 'data', 'item_education.json')).read()) for i in items: item = frappe.new_doc('Item') item.update(i) diff --git a/erpnext/demo/setup/setup_data.py b/erpnext/demo/setup/setup_data.py index d395493c470..c7babc00249 100644 --- a/erpnext/demo/setup/setup_data.py +++ b/erpnext/demo/setup/setup_data.py @@ -229,10 +229,10 @@ def setup_user_roles(): user.add_roles('HR User', 'Projects User') frappe.db.set_global('demo_projects_user', user.name) - if not frappe.db.get_global('demo_schools_user'): + if not frappe.db.get_global('demo_education_user'): user = frappe.get_doc('User', 'aromn@example.com') user.add_roles('Academics User') - frappe.db.set_global('demo_schools_user', user.name) + frappe.db.set_global('demo_education_user', user.name) #Add Expense Approver user = frappe.get_doc('User', 'WanMai@example.com') diff --git a/erpnext/demo/user/schools.py b/erpnext/demo/user/education.py similarity index 93% rename from erpnext/demo/user/schools.py rename to erpnext/demo/user/education.py index 422c31a9d83..8c82f879ab7 100644 --- a/erpnext/demo/user/schools.py +++ b/erpnext/demo/user/education.py @@ -1,3 +1,4 @@ + # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt @@ -8,13 +9,12 @@ import random from frappe.utils import cstr from frappe.utils.make_random import get_random from datetime import timedelta -from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, \ +from erpnext.education.api import get_student_group_students, make_attendance_records, enroll_student, \ get_fee_schedule, collect_fees, get_course -from erpnext.schools.doctype.program_enrollment.program_enrollment import get_program_courses -from erpnext.schools.doctype.student_group.student_group import get_students + def work(): - frappe.set_user(frappe.db.get_global('demo_schools_user')) + frappe.set_user(frappe.db.get_global('demo_education_user')) for d in xrange(20): approve_random_student_applicant() enroll_random_student(frappe.flags.current_date) diff --git a/erpnext/docs/assets/img/schools/__init__.py b/erpnext/docs/assets/img/education/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/__init__.py rename to erpnext/docs/assets/img/education/__init__.py diff --git a/erpnext/docs/assets/img/schools/admission/__init__.py b/erpnext/docs/assets/img/education/admission/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/admission/__init__.py rename to erpnext/docs/assets/img/education/admission/__init__.py diff --git a/erpnext/docs/assets/img/schools/admission/program-enrollment-tool.gif b/erpnext/docs/assets/img/education/admission/program-enrollment-tool.gif similarity index 100% rename from erpnext/docs/assets/img/schools/admission/program-enrollment-tool.gif rename to erpnext/docs/assets/img/education/admission/program-enrollment-tool.gif diff --git a/erpnext/docs/assets/img/schools/admission/program-enrollment-tool01.gif b/erpnext/docs/assets/img/education/admission/program-enrollment-tool01.gif similarity index 100% rename from erpnext/docs/assets/img/schools/admission/program-enrollment-tool01.gif rename to erpnext/docs/assets/img/education/admission/program-enrollment-tool01.gif diff --git a/erpnext/docs/assets/img/schools/admission/program-enrollment.gif b/erpnext/docs/assets/img/education/admission/program-enrollment.gif similarity index 100% rename from erpnext/docs/assets/img/schools/admission/program-enrollment.gif rename to erpnext/docs/assets/img/education/admission/program-enrollment.gif diff --git a/erpnext/docs/assets/img/schools/admission/student-admission.gif b/erpnext/docs/assets/img/education/admission/student-admission.gif similarity index 100% rename from erpnext/docs/assets/img/schools/admission/student-admission.gif rename to erpnext/docs/assets/img/education/admission/student-admission.gif diff --git a/erpnext/docs/assets/img/schools/admission/student-applicant-enroll.png b/erpnext/docs/assets/img/education/admission/student-applicant-enroll.png similarity index 100% rename from erpnext/docs/assets/img/schools/admission/student-applicant-enroll.png rename to erpnext/docs/assets/img/education/admission/student-applicant-enroll.png diff --git a/erpnext/docs/assets/img/schools/admission/student-applicant.png b/erpnext/docs/assets/img/education/admission/student-applicant.png similarity index 100% rename from erpnext/docs/assets/img/schools/admission/student-applicant.png rename to erpnext/docs/assets/img/education/admission/student-applicant.png diff --git a/erpnext/docs/assets/img/schools/admission/student-application-actions.png b/erpnext/docs/assets/img/education/admission/student-application-actions.png similarity index 100% rename from erpnext/docs/assets/img/schools/admission/student-application-actions.png rename to erpnext/docs/assets/img/education/admission/student-application-actions.png diff --git a/erpnext/docs/assets/img/schools/assessment/__init__.py b/erpnext/docs/assets/img/education/assessment/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/__init__.py rename to erpnext/docs/assets/img/education/assessment/__init__.py diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-criteria.png b/erpnext/docs/assets/img/education/assessment/assessment-criteria.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-criteria.png rename to erpnext/docs/assets/img/education/assessment/assessment-criteria.png diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-group-details.png b/erpnext/docs/assets/img/education/assessment/assessment-group-details.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-group-details.png rename to erpnext/docs/assets/img/education/assessment/assessment-group-details.png diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-group-term.png b/erpnext/docs/assets/img/education/assessment/assessment-group-term.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-group-term.png rename to erpnext/docs/assets/img/education/assessment/assessment-group-term.png diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-plan-criteria.png b/erpnext/docs/assets/img/education/assessment/assessment-plan-criteria.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-plan-criteria.png rename to erpnext/docs/assets/img/education/assessment/assessment-plan-criteria.png diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-plan-details.png b/erpnext/docs/assets/img/education/assessment/assessment-plan-details.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-plan-details.png rename to erpnext/docs/assets/img/education/assessment/assessment-plan-details.png diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-result-tool.png b/erpnext/docs/assets/img/education/assessment/assessment-result-tool.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-result-tool.png rename to erpnext/docs/assets/img/education/assessment/assessment-result-tool.png diff --git a/erpnext/docs/assets/img/schools/assessment/assessment-result.png b/erpnext/docs/assets/img/education/assessment/assessment-result.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/assessment-result.png rename to erpnext/docs/assets/img/education/assessment/assessment-result.png diff --git a/erpnext/docs/assets/img/schools/assessment/grading-scale.png b/erpnext/docs/assets/img/education/assessment/grading-scale.png similarity index 100% rename from erpnext/docs/assets/img/schools/assessment/grading-scale.png rename to erpnext/docs/assets/img/education/assessment/grading-scale.png diff --git a/erpnext/docs/assets/img/schools/fees/__init__.py b/erpnext/docs/assets/img/education/fees/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/fees/__init__.py rename to erpnext/docs/assets/img/education/fees/__init__.py diff --git a/erpnext/docs/assets/img/schools/fees/fee-category.png b/erpnext/docs/assets/img/education/fees/fee-category.png similarity index 100% rename from erpnext/docs/assets/img/schools/fees/fee-category.png rename to erpnext/docs/assets/img/education/fees/fee-category.png diff --git a/erpnext/docs/assets/img/schools/fees/fee-structure.png b/erpnext/docs/assets/img/education/fees/fee-structure.png similarity index 100% rename from erpnext/docs/assets/img/schools/fees/fee-structure.png rename to erpnext/docs/assets/img/education/fees/fee-structure.png diff --git a/erpnext/docs/assets/img/schools/fees/fees-section.png b/erpnext/docs/assets/img/education/fees/fees-section.png similarity index 100% rename from erpnext/docs/assets/img/schools/fees/fees-section.png rename to erpnext/docs/assets/img/education/fees/fees-section.png diff --git a/erpnext/docs/assets/img/schools/fees/fees.png b/erpnext/docs/assets/img/education/fees/fees.png similarity index 100% rename from erpnext/docs/assets/img/schools/fees/fees.png rename to erpnext/docs/assets/img/education/fees/fees.png diff --git a/erpnext/docs/assets/img/schools/home.png b/erpnext/docs/assets/img/education/home.png similarity index 100% rename from erpnext/docs/assets/img/schools/home.png rename to erpnext/docs/assets/img/education/home.png diff --git a/erpnext/docs/assets/img/schools/module.png b/erpnext/docs/assets/img/education/module.png similarity index 100% rename from erpnext/docs/assets/img/schools/module.png rename to erpnext/docs/assets/img/education/module.png diff --git a/erpnext/docs/assets/img/schools/schedule/__init__.py b/erpnext/docs/assets/img/education/schedule/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/__init__.py rename to erpnext/docs/assets/img/education/schedule/__init__.py diff --git a/erpnext/docs/assets/img/schools/schedule/course-schedule-att-1.png b/erpnext/docs/assets/img/education/schedule/course-schedule-att-1.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/course-schedule-att-1.png rename to erpnext/docs/assets/img/education/schedule/course-schedule-att-1.png diff --git a/erpnext/docs/assets/img/schools/schedule/course-schedule-att.png b/erpnext/docs/assets/img/education/schedule/course-schedule-att.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/course-schedule-att.png rename to erpnext/docs/assets/img/education/schedule/course-schedule-att.png diff --git a/erpnext/docs/assets/img/schools/schedule/course-schedule.png b/erpnext/docs/assets/img/education/schedule/course-schedule.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/course-schedule.png rename to erpnext/docs/assets/img/education/schedule/course-schedule.png diff --git a/erpnext/docs/assets/img/schools/schedule/examination.png b/erpnext/docs/assets/img/education/schedule/examination.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/examination.png rename to erpnext/docs/assets/img/education/schedule/examination.png diff --git a/erpnext/docs/assets/img/schools/schedule/schedule-section.png b/erpnext/docs/assets/img/education/schedule/schedule-section.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/schedule-section.png rename to erpnext/docs/assets/img/education/schedule/schedule-section.png diff --git a/erpnext/docs/assets/img/schools/schedule/scheduling-tool.png b/erpnext/docs/assets/img/education/schedule/scheduling-tool.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/scheduling-tool.png rename to erpnext/docs/assets/img/education/schedule/scheduling-tool.png diff --git a/erpnext/docs/assets/img/schools/schedule/student-attendance.gif b/erpnext/docs/assets/img/education/schedule/student-attendance.gif similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/student-attendance.gif rename to erpnext/docs/assets/img/education/schedule/student-attendance.gif diff --git a/erpnext/docs/assets/img/schools/schedule/student-attendance.png b/erpnext/docs/assets/img/education/schedule/student-attendance.png similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/student-attendance.png rename to erpnext/docs/assets/img/education/schedule/student-attendance.png diff --git a/erpnext/docs/assets/img/schools/schedule/student-leave-application.gif b/erpnext/docs/assets/img/education/schedule/student-leave-application.gif similarity index 100% rename from erpnext/docs/assets/img/schools/schedule/student-leave-application.gif rename to erpnext/docs/assets/img/education/schedule/student-leave-application.gif diff --git a/erpnext/docs/assets/img/schools/setup/Course-schedule-error.png b/erpnext/docs/assets/img/education/setup/Course-schedule-error.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/Course-schedule-error.png rename to erpnext/docs/assets/img/education/setup/Course-schedule-error.png diff --git a/erpnext/docs/assets/img/schools/setup/Room-Assesment-plan.png b/erpnext/docs/assets/img/education/setup/Room-Assesment-plan.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/Room-Assesment-plan.png rename to erpnext/docs/assets/img/education/setup/Room-Assesment-plan.png diff --git a/erpnext/docs/assets/img/schools/setup/__init__.py b/erpnext/docs/assets/img/education/setup/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/setup/__init__.py rename to erpnext/docs/assets/img/education/setup/__init__.py diff --git a/erpnext/docs/assets/img/schools/setup/academic-term.png b/erpnext/docs/assets/img/education/setup/academic-term.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/academic-term.png rename to erpnext/docs/assets/img/education/setup/academic-term.png diff --git a/erpnext/docs/assets/img/schools/setup/academic-year.png b/erpnext/docs/assets/img/education/setup/academic-year.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/academic-year.png rename to erpnext/docs/assets/img/education/setup/academic-year.png diff --git a/erpnext/docs/assets/img/schools/setup/course-fee-program.png b/erpnext/docs/assets/img/education/setup/course-fee-program.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/course-fee-program.png rename to erpnext/docs/assets/img/education/setup/course-fee-program.png diff --git a/erpnext/docs/assets/img/schools/setup/course.png b/erpnext/docs/assets/img/education/setup/course.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/course.png rename to erpnext/docs/assets/img/education/setup/course.png diff --git a/erpnext/docs/assets/img/schools/setup/instructor.png b/erpnext/docs/assets/img/education/setup/instructor.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/instructor.png rename to erpnext/docs/assets/img/education/setup/instructor.png diff --git a/erpnext/docs/assets/img/schools/setup/program.png b/erpnext/docs/assets/img/education/setup/program.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/program.png rename to erpnext/docs/assets/img/education/setup/program.png diff --git a/erpnext/docs/assets/img/schools/setup/room.png b/erpnext/docs/assets/img/education/setup/room.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/room.png rename to erpnext/docs/assets/img/education/setup/room.png diff --git a/erpnext/docs/assets/img/schools/setup/student-attendance-tool.gif b/erpnext/docs/assets/img/education/setup/student-attendance-tool.gif similarity index 100% rename from erpnext/docs/assets/img/schools/setup/student-attendance-tool.gif rename to erpnext/docs/assets/img/education/setup/student-attendance-tool.gif diff --git a/erpnext/docs/assets/img/schools/setup/student-group-instructor.png b/erpnext/docs/assets/img/education/setup/student-group-instructor.png similarity index 100% rename from erpnext/docs/assets/img/schools/setup/student-group-instructor.png rename to erpnext/docs/assets/img/education/setup/student-group-instructor.png diff --git a/erpnext/docs/assets/img/schools/student/__init__.py b/erpnext/docs/assets/img/education/student/__init__.py similarity index 100% rename from erpnext/docs/assets/img/schools/student/__init__.py rename to erpnext/docs/assets/img/education/student/__init__.py diff --git a/erpnext/docs/assets/img/schools/student/guardian.png b/erpnext/docs/assets/img/education/student/guardian.png similarity index 100% rename from erpnext/docs/assets/img/schools/student/guardian.png rename to erpnext/docs/assets/img/education/student/guardian.png diff --git a/erpnext/docs/assets/img/schools/student/schools-settings.png b/erpnext/docs/assets/img/education/student/schools-settings.png similarity index 100% rename from erpnext/docs/assets/img/schools/student/schools-settings.png rename to erpnext/docs/assets/img/education/student/schools-settings.png diff --git a/erpnext/docs/assets/img/schools/student/student group.gif b/erpnext/docs/assets/img/education/student/student group.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student group.gif rename to erpnext/docs/assets/img/education/student/student group.gif diff --git a/erpnext/docs/assets/img/schools/student/student-admission.gif b/erpnext/docs/assets/img/education/student/student-admission.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-admission.gif rename to erpnext/docs/assets/img/education/student/student-admission.gif diff --git a/erpnext/docs/assets/img/schools/student/student-batch-validation.gif b/erpnext/docs/assets/img/education/student/student-batch-validation.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-batch-validation.gif rename to erpnext/docs/assets/img/education/student/student-batch-validation.gif diff --git a/erpnext/docs/assets/img/schools/student/student-batch.gif b/erpnext/docs/assets/img/education/student/student-batch.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-batch.gif rename to erpnext/docs/assets/img/education/student/student-batch.gif diff --git a/erpnext/docs/assets/img/schools/student/student-course-validation.gif b/erpnext/docs/assets/img/education/student/student-course-validation.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-course-validation.gif rename to erpnext/docs/assets/img/education/student/student-course-validation.gif diff --git a/erpnext/docs/assets/img/schools/student/student-group-attendance.gif b/erpnext/docs/assets/img/education/student/student-group-attendance.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-group-attendance.gif rename to erpnext/docs/assets/img/education/student/student-group-attendance.gif diff --git a/erpnext/docs/assets/img/schools/student/student-group-creation-tool.gif b/erpnext/docs/assets/img/education/student/student-group-creation-tool.gif similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-group-creation-tool.gif rename to erpnext/docs/assets/img/education/student/student-group-creation-tool.gif diff --git a/erpnext/docs/assets/img/schools/student/student-log.png b/erpnext/docs/assets/img/education/student/student-log.png similarity index 100% rename from erpnext/docs/assets/img/schools/student/student-log.png rename to erpnext/docs/assets/img/education/student/student-log.png diff --git a/erpnext/docs/assets/img/schools/student/student.png b/erpnext/docs/assets/img/education/student/student.png similarity index 100% rename from erpnext/docs/assets/img/schools/student/student.png rename to erpnext/docs/assets/img/education/student/student.png diff --git a/erpnext/docs/user/manual/en/schools/Assessment/__init__.py b/erpnext/docs/user/manual/en/education/Assessment/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/Assessment/__init__.py rename to erpnext/docs/user/manual/en/education/Assessment/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/Assessment/assessment_criteria.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md similarity index 82% rename from erpnext/docs/user/manual/en/schools/Assessment/assessment_criteria.md rename to erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md index c422578a5ea..b97cfb12596 100644 --- a/erpnext/docs/user/manual/en/schools/Assessment/assessment_criteria.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria.md @@ -2,12 +2,12 @@ Assessment Criteria is the parameter based on which you assess the Student. -Assessment Criteria +Assessment Criteria After assessment is conducted for a Course, marks earned are entered based on the Assessment Criteria. For example, if assessment was conducted for science subject, then you can evaluate Student in Science on various criteria like Writing, Practicals, Presentation etc. Assessment Criteria is be used when scheduling Assessment Plan for Student Group and Course. -Assessment Plan Criteria +Assessment Plan Criteria {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/Assessment/assessment_criteria_group.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_criteria_group.md similarity index 100% rename from erpnext/docs/user/manual/en/schools/Assessment/assessment_criteria_group.md rename to erpnext/docs/user/manual/en/education/Assessment/assessment_criteria_group.md diff --git a/erpnext/docs/user/manual/en/schools/Assessment/assessment_group.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_group.md similarity index 79% rename from erpnext/docs/user/manual/en/schools/Assessment/assessment_group.md rename to erpnext/docs/user/manual/en/education/Assessment/assessment_group.md index 90c7b5d3467..ed02a5366dd 100644 --- a/erpnext/docs/user/manual/en/schools/Assessment/assessment_group.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_group.md @@ -4,10 +4,10 @@ Assessment Group tree is a master where you can define the hierarchy for examina For example, if you conduct two assessment in a academic year, then setup Assessment Group as following. -Assessment Group Term +Assessment Group Term On the same lines, you can also define multiple Assessment Group bases on assessment conducted in your institute. -Assessment Group Term +Assessment Group Term {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/Assessment/assessment_plan.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md similarity index 81% rename from erpnext/docs/user/manual/en/schools/Assessment/assessment_plan.md rename to erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md index 103def13241..7272279c9b5 100644 --- a/erpnext/docs/user/manual/en/schools/Assessment/assessment_plan.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_plan.md @@ -10,10 +10,10 @@ To schedule an assessment/examination for a Student Group, for specific Course, 4. Examiner and Supervisor -Assessment Plan Details +Assessment Plan Details 5. Assessment Criteria is list of criteria based which each student in will be evaluated and grades will be assigned. -Assessment Plan Criteria +Assessment Plan Criteria {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/Assessment/assessment_result.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_result.md similarity index 68% rename from erpnext/docs/user/manual/en/schools/Assessment/assessment_result.md rename to erpnext/docs/user/manual/en/education/Assessment/assessment_result.md index dc35ca7ee9e..ed3e5fb3344 100644 --- a/erpnext/docs/user/manual/en/schools/Assessment/assessment_result.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_result.md @@ -1,7 +1,7 @@ #Assessment Result -Assessment Result is a log of marks/grades earned by the student for specific Assessment. Assessment Result is created in the backend based on the marks entered in the [Assessment Result Tool](/docs/user/manual/en/schools/assessment/assessment_result_tool.html). +Assessment Result is a log of marks/grades earned by the student for specific Assessment. Assessment Result is created in the backend based on the marks entered in the [Assessment Result Tool](/docs/user/manual/en/education/assessment/assessment_result_tool.html). -Assessment Result +Assessment Result {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/Assessment/assessment_result_tool.md b/erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md similarity index 89% rename from erpnext/docs/user/manual/en/schools/Assessment/assessment_result_tool.md rename to erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md index bb2a2ba4636..88b7a7a078e 100644 --- a/erpnext/docs/user/manual/en/schools/Assessment/assessment_result_tool.md +++ b/erpnext/docs/user/manual/en/education/Assessment/assessment_result_tool.md @@ -2,7 +2,7 @@ Assessment Result Tool help you entering marks earned by the Students for specific course. In this tool, based on the Assessment Plan, all the Student will be fetched into Assessment Result Tool. Also, Columns for Assessment Criteria will be where marks earned can be entered for each Student. -Assessment Result Tool +Assessment Result Tool 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. diff --git a/erpnext/docs/user/manual/en/schools/Assessment/grading_scale.md b/erpnext/docs/user/manual/en/education/Assessment/grading_scale.md similarity index 83% rename from erpnext/docs/user/manual/en/schools/Assessment/grading_scale.md rename to erpnext/docs/user/manual/en/education/Assessment/grading_scale.md index 45191124b89..0ad610b6331 100644 --- a/erpnext/docs/user/manual/en/schools/Assessment/grading_scale.md +++ b/erpnext/docs/user/manual/en/education/Assessment/grading_scale.md @@ -2,6 +2,6 @@ In the Grading Scale, you can define various grades and threshold for them. Based on the score earned by an Student for an Assessment, Grade will be assigned. -Grading Scale +Grading Scale {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/Assessment/index.md b/erpnext/docs/user/manual/en/education/Assessment/index.md similarity index 100% rename from erpnext/docs/user/manual/en/schools/Assessment/index.md rename to erpnext/docs/user/manual/en/education/Assessment/index.md diff --git a/erpnext/docs/user/manual/en/schools/Assessment/index.txt b/erpnext/docs/user/manual/en/education/Assessment/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/Assessment/index.txt rename to erpnext/docs/user/manual/en/education/Assessment/index.txt diff --git a/erpnext/docs/user/manual/en/schools/Attendance/__init__.py b/erpnext/docs/user/manual/en/education/Attendance/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/Attendance/__init__.py rename to erpnext/docs/user/manual/en/education/Attendance/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/Attendance/index.md b/erpnext/docs/user/manual/en/education/Attendance/index.md similarity index 100% rename from erpnext/docs/user/manual/en/schools/Attendance/index.md rename to erpnext/docs/user/manual/en/education/Attendance/index.md diff --git a/erpnext/docs/user/manual/en/schools/Attendance/index.txt b/erpnext/docs/user/manual/en/education/Attendance/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/Attendance/index.txt rename to erpnext/docs/user/manual/en/education/Attendance/index.txt diff --git a/erpnext/docs/user/manual/en/schools/Attendance/student-attendance-tool.md b/erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md similarity index 87% rename from erpnext/docs/user/manual/en/schools/Attendance/student-attendance-tool.md rename to erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md index 5c4ce3072a3..fac9d6e69d8 100644 --- a/erpnext/docs/user/manual/en/schools/Attendance/student-attendance-tool.md +++ b/erpnext/docs/user/manual/en/education/Attendance/student-attendance-tool.md @@ -10,6 +10,6 @@ To mark the **Attedance* based on Student Group select the group based on Student detials will be autofetched and you can mark the attendance of the given date. -Student Attendance +Student Attendance {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/Attendance/student-attendance.md b/erpnext/docs/user/manual/en/education/Attendance/student-attendance.md similarity index 92% rename from erpnext/docs/user/manual/en/schools/Attendance/student-attendance.md rename to erpnext/docs/user/manual/en/education/Attendance/student-attendance.md index 1b917d0ae26..4be2831f309 100644 --- a/erpnext/docs/user/manual/en/schools/Attendance/student-attendance.md +++ b/erpnext/docs/user/manual/en/education/Attendance/student-attendance.md @@ -8,7 +8,7 @@ To create Attendance record : Select the **Student, Course Schedule and Student Group** for which attendance is to be marked for the given date. Set the Status to Present/Absent and save. -Student Attendance +Student Attendance **Student Attendance tool** can be used for bulk updation of the attendance based on **Batch, Course or Activity**. diff --git a/erpnext/docs/user/manual/en/schools/Attendance/student-leave-application.md b/erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md similarity index 63% rename from erpnext/docs/user/manual/en/schools/Attendance/student-leave-application.md rename to erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md index 5620bdadd73..e22c6e9d688 100644 --- a/erpnext/docs/user/manual/en/schools/Attendance/student-leave-application.md +++ b/erpnext/docs/user/manual/en/education/Attendance/student-leave-application.md @@ -4,9 +4,9 @@ ERPNext allows you to record the leave application for a student. To create a Student Leave application record, enter the Student and the date for the leave is applied and save. -Student Attendance +Student Attendance -Incase the student is not attending the school in order to participate or represent school in any event, he/she can be mark as present from the Leave Application itself. +Incase the student is not attending the institute in order to participate or represent institute in any event, he/she can be mark as present from the Leave Application itself. 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. diff --git a/erpnext/docs/user/manual/en/schools/__init__.py b/erpnext/docs/user/manual/en/education/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/__init__.py rename to erpnext/docs/user/manual/en/education/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/admission/__init__.py b/erpnext/docs/user/manual/en/education/admission/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/admission/__init__.py rename to erpnext/docs/user/manual/en/education/admission/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/admission/index.md b/erpnext/docs/user/manual/en/education/admission/index.md similarity index 100% rename from erpnext/docs/user/manual/en/schools/admission/index.md rename to erpnext/docs/user/manual/en/education/admission/index.md diff --git a/erpnext/docs/user/manual/en/schools/admission/index.txt b/erpnext/docs/user/manual/en/education/admission/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/admission/index.txt rename to erpnext/docs/user/manual/en/education/admission/index.txt diff --git a/erpnext/docs/user/manual/en/schools/admission/program-enrollment-tool.md b/erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md similarity index 81% rename from erpnext/docs/user/manual/en/schools/admission/program-enrollment-tool.md rename to erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md index 2a2fa1e58e7..53d9d9c84d1 100644 --- a/erpnext/docs/user/manual/en/schools/admission/program-enrollment-tool.md +++ b/erpnext/docs/user/manual/en/education/admission/program-enrollment-tool.md @@ -7,10 +7,10 @@ You can create the the Program Enrollment for : 1. **Student Applicants** >> List of Student Applicants will be fetched for the selected **Program** and **Academic year**. -Student Applicant Enrollment +Student Applicant Enrollment 2. **Program Enrollment** >> You can bulk update the **Program** for the students from one academic year to another in the same **Program** or a new **Program**. -Student Applicant Enrollment +Student Applicant Enrollment {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/admission/program-enrollment.md b/erpnext/docs/user/manual/en/education/admission/program-enrollment.md similarity index 91% rename from erpnext/docs/user/manual/en/schools/admission/program-enrollment.md rename to erpnext/docs/user/manual/en/education/admission/program-enrollment.md index cc1308cf6c1..0bf16dfd3a0 100644 --- a/erpnext/docs/user/manual/en/schools/admission/program-enrollment.md +++ b/erpnext/docs/user/manual/en/education/admission/program-enrollment.md @@ -4,7 +4,7 @@ Program Enrollment describes an educational model where students must complete a Once a student have applied for the **Program** and the application is approved, the program enrollment is done for that student. -Student Applicant Enrollment +Student Applicant Enrollment - A student can be enrolled in multiple Course for a program in a given academeic year. - Based on the Fee structure selected at the time of enrollment Fee detials are created of the student. diff --git a/erpnext/docs/user/manual/en/schools/admission/student-applicant.md b/erpnext/docs/user/manual/en/education/admission/student-applicant.md similarity index 86% rename from erpnext/docs/user/manual/en/schools/admission/student-applicant.md rename to erpnext/docs/user/manual/en/education/admission/student-applicant.md index 22d370939d1..121844cf9a5 100644 --- a/erpnext/docs/user/manual/en/schools/admission/student-applicant.md +++ b/erpnext/docs/user/manual/en/education/admission/student-applicant.md @@ -3,7 +3,7 @@ A Student Applicant record needs to be created when a student applies for a program at your institute. You can Approve or Reject a student applicant. By accepting a student applicant you can add them to the student master. -Student Applicant +Student Applicant ### Application Status @@ -20,11 +20,11 @@ You can Approve or Reject a student applicant. By accepting a student applicant ### Student Enrollment Once the form is submitted you can either approve or reject the application form. -Student Applicant Enrollment +Student Applicant Enrollment Once you approve a Student Applicant you can enroll them to a program. When you click the 'Enroll' buttom, -the system shall create a student against that applicant and redirect you to the [Program Enrollment form](/docs/user/manual/en/schools/student/program-enrollment.html). +the system shall create a student against that applicant and redirect you to the [Program Enrollment form](/docs/user/manual/en/education/student/program-enrollment.html). -Student Applicant Enrollment +Student Applicant Enrollment {next} diff --git a/erpnext/docs/user/manual/en/schools/admission/student_admission.md b/erpnext/docs/user/manual/en/education/admission/student_admission.md similarity index 84% rename from erpnext/docs/user/manual/en/schools/admission/student_admission.md rename to erpnext/docs/user/manual/en/education/admission/student_admission.md index 7a63fa7a75c..f2b8ef6102c 100644 --- a/erpnext/docs/user/manual/en/schools/admission/student_admission.md +++ b/erpnext/docs/user/manual/en/education/admission/student_admission.md @@ -4,10 +4,10 @@ The admission process begins with filling the admission form. The Student Admiss To create a Student Admission record go to : -**Schools** >> **Admissions** >> **Student Admission** >> +**education** >> **Admissions** >> **Student Admission** >> -Student Applicant +Student Applicant Once an admission record is created, the age eligibility criteria can be determined for the every program. Similarly, you can also determine the application fee and naming series for every student applicant. If you keep the naming series blank then the default naming series will be applied for every student applicant. diff --git a/erpnext/docs/user/manual/en/schools/fees/__init__.py b/erpnext/docs/user/manual/en/education/fees/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/fees/__init__.py rename to erpnext/docs/user/manual/en/education/fees/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/fees/fee-category.md b/erpnext/docs/user/manual/en/education/fees/fee-category.md similarity index 75% rename from erpnext/docs/user/manual/en/schools/fees/fee-category.md rename to erpnext/docs/user/manual/en/education/fees/fee-category.md index fbf43e6f238..8a4822f3b49 100644 --- a/erpnext/docs/user/manual/en/schools/fees/fee-category.md +++ b/erpnext/docs/user/manual/en/education/fees/fee-category.md @@ -2,6 +2,6 @@ List of all different type of fees collected. -Fees Category +Fees Category {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/fees/fee-structure.md b/erpnext/docs/user/manual/en/education/fees/fee-structure.md similarity index 78% rename from erpnext/docs/user/manual/en/schools/fees/fee-structure.md rename to erpnext/docs/user/manual/en/education/fees/fee-structure.md index a1dd9be6adc..b1cc36d878a 100644 --- a/erpnext/docs/user/manual/en/schools/fees/fee-structure.md +++ b/erpnext/docs/user/manual/en/education/fees/fee-structure.md @@ -2,6 +2,6 @@ A Fee Structure is a template that can be used while making fee records. -Fees Structure +Fees Structure {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/education/fees/fees.md b/erpnext/docs/user/manual/en/education/fees/fees.md new file mode 100644 index 00000000000..5e0c126dff2 --- /dev/null +++ b/erpnext/docs/user/manual/en/education/fees/fees.md @@ -0,0 +1,8 @@ +# Fees + +Maintain a record of fees collected from students. +The [Fee Structure](/docs/user/manual/en/education/fees/fee-structure.html) is fetched based on the selected Program and Academic Term. + +Fees + +{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/fees/index.md b/erpnext/docs/user/manual/en/education/fees/index.md similarity index 76% rename from erpnext/docs/user/manual/en/schools/fees/index.md rename to erpnext/docs/user/manual/en/education/fees/index.md index c5be5f6810e..d0ccb948574 100644 --- a/erpnext/docs/user/manual/en/schools/fees/index.md +++ b/erpnext/docs/user/manual/en/education/fees/index.md @@ -2,7 +2,7 @@ This section contains 'Fee' related documents. -Fees Section +Fees Section ### Topics diff --git a/erpnext/docs/user/manual/en/schools/fees/index.txt b/erpnext/docs/user/manual/en/education/fees/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/fees/index.txt rename to erpnext/docs/user/manual/en/education/fees/index.txt diff --git a/erpnext/docs/user/manual/en/education/index.md b/erpnext/docs/user/manual/en/education/index.md new file mode 100644 index 00000000000..36c6bbd7729 --- /dev/null +++ b/erpnext/docs/user/manual/en/education/index.md @@ -0,0 +1,8 @@ +# Education + + +The Education Domain in ERPNext is designed to meet requirements of any educational Institute whether that is a school, college or any other private firm. ERPNext provides a centralized system, which can be used to maintain and update all the activities related to an Institution. It will provide a complete package for every funcationality required in any institute like Online Admission, Fees, Attendance, Examination. + +Fees Section + +{index} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/index.txt b/erpnext/docs/user/manual/en/education/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/index.txt rename to erpnext/docs/user/manual/en/education/index.txt diff --git a/erpnext/docs/user/manual/en/schools/schedule/__init__.py b/erpnext/docs/user/manual/en/education/schedule/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/schedule/__init__.py rename to erpnext/docs/user/manual/en/education/schedule/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/schedule/course-schedule.md b/erpnext/docs/user/manual/en/education/schedule/course-schedule.md similarity index 84% rename from erpnext/docs/user/manual/en/schools/schedule/course-schedule.md rename to erpnext/docs/user/manual/en/education/schedule/course-schedule.md index 9f7d9809988..f5134d59fff 100644 --- a/erpnext/docs/user/manual/en/schools/schedule/course-schedule.md +++ b/erpnext/docs/user/manual/en/education/schedule/course-schedule.md @@ -3,13 +3,13 @@ Course Schedule is the schedule of a session conducted by an Instructor for a particular Course. You can see the overall course schedule in the Calendar view. -Course Schedule +Course Schedule ### Marking Attendance You can mark attendance for a Student Group against a Course Schedule. -Course Schedule Attendance +Course Schedule Attendance - To make attendance, expand the attendance section. - Check the students who were present for that session. @@ -20,6 +20,6 @@ You can mark attendance for a Student Group against a Course Schedule. Once you have marked Attendance against a Course Schedule the Attendance section in the Course Schedule shall be hidden. A View Attendance button shall appear. Click on that button to view all attendance records created against that Course Schedule. -Course Schedule Attendance +Course Schedule Attendance {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/schedule/examination.md b/erpnext/docs/user/manual/en/education/schedule/examination.md similarity index 80% rename from erpnext/docs/user/manual/en/schools/schedule/examination.md rename to erpnext/docs/user/manual/en/education/schedule/examination.md index d167e9c56d7..d21d204189c 100644 --- a/erpnext/docs/user/manual/en/schools/schedule/examination.md +++ b/erpnext/docs/user/manual/en/education/schedule/examination.md @@ -2,7 +2,7 @@ The Examination record can be used to track the exam schedule and the results of that exam. -Examination +Examination {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/schedule/index.md b/erpnext/docs/user/manual/en/education/schedule/index.md similarity index 62% rename from erpnext/docs/user/manual/en/schools/schedule/index.md rename to erpnext/docs/user/manual/en/education/schedule/index.md index 57e578bd98a..247b0b88930 100644 --- a/erpnext/docs/user/manual/en/schools/schedule/index.md +++ b/erpnext/docs/user/manual/en/education/schedule/index.md @@ -1,6 +1,6 @@ # Schedule -Schedule Section +Schedule Section ### Topics diff --git a/erpnext/docs/user/manual/en/schools/schedule/index.txt b/erpnext/docs/user/manual/en/education/schedule/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/schedule/index.txt rename to erpnext/docs/user/manual/en/education/schedule/index.txt diff --git a/erpnext/docs/user/manual/en/schools/schedule/scheduling-tool.md b/erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md similarity index 96% rename from erpnext/docs/user/manual/en/schools/schedule/scheduling-tool.md rename to erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md index 9e13d6d0a6a..08a7fa9ec0c 100644 --- a/erpnext/docs/user/manual/en/schools/schedule/scheduling-tool.md +++ b/erpnext/docs/user/manual/en/education/schedule/scheduling-tool.md @@ -2,7 +2,7 @@ This tool can be used to create 'Course Schedules'. -Scheduling Tool +Scheduling Tool ### Creating Course Schedules diff --git a/erpnext/docs/user/manual/en/schools/setup/__init__.py b/erpnext/docs/user/manual/en/education/setup/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/setup/__init__.py rename to erpnext/docs/user/manual/en/education/setup/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/setup/academic-term.md b/erpnext/docs/user/manual/en/education/setup/academic-term.md similarity index 92% rename from erpnext/docs/user/manual/en/schools/setup/academic-term.md rename to erpnext/docs/user/manual/en/education/setup/academic-term.md index b52bea71086..d264dca5d66 100644 --- a/erpnext/docs/user/manual/en/schools/setup/academic-term.md +++ b/erpnext/docs/user/manual/en/education/setup/academic-term.md @@ -4,7 +4,7 @@ An academic term (or simply "term") is a portion of an academic year, the time d The **Academic term** form in ERPNext enables you to create academic terms within in a year. Based on the term schedule enter the start and end date for the schedule and generate the term for a Academic year. -Academic Term +Academic Term {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/setup/academic-year.md b/erpnext/docs/user/manual/en/education/setup/academic-year.md similarity index 61% rename from erpnext/docs/user/manual/en/schools/setup/academic-year.md rename to erpnext/docs/user/manual/en/education/setup/academic-year.md index 4fc5f929a56..c9ea5211854 100644 --- a/erpnext/docs/user/manual/en/schools/setup/academic-year.md +++ b/erpnext/docs/user/manual/en/education/setup/academic-year.md @@ -1,10 +1,10 @@ # Academic Year -An academic year is a period of time which schools, colleges and universities use to measure a quantity of study. +An academic year is a period of time which education, colleges and universities use to measure a quantity of study. The **Academic year** form have the Start and End date for the Academic year. -Academic Year +Academic Year **Student group** link is given to view or add the respective groups to the Academic year. diff --git a/erpnext/docs/user/manual/en/schools/setup/course.md b/erpnext/docs/user/manual/en/education/setup/course.md similarity index 78% rename from erpnext/docs/user/manual/en/schools/setup/course.md rename to erpnext/docs/user/manual/en/education/setup/course.md index dc10ed54b17..0d6e5ac5eb7 100644 --- a/erpnext/docs/user/manual/en/schools/setup/course.md +++ b/erpnext/docs/user/manual/en/education/setup/course.md @@ -4,11 +4,11 @@ To create a **Course** enter the Course name and Code. Code for the course should be unique for every course. You can also link the department under which the course is conducted. -Course +Course Once a **Course** is created, a course schedule can defined for the same. -Course +Course 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**. diff --git a/erpnext/docs/user/manual/en/education/setup/index.md b/erpnext/docs/user/manual/en/education/setup/index.md new file mode 100644 index 00000000000..1062c3a4acd --- /dev/null +++ b/erpnext/docs/user/manual/en/education/setup/index.md @@ -0,0 +1,9 @@ +# Setup + +The Setup section of education module provides facility to make some basic configuration. Below are doctypes for basic configuration. + +Setup Section + +### Topics + +{index} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/setup/index.txt b/erpnext/docs/user/manual/en/education/setup/index.txt similarity index 84% rename from erpnext/docs/user/manual/en/schools/setup/index.txt rename to erpnext/docs/user/manual/en/education/setup/index.txt index 8fb9bb2def9..9f88c5de3c9 100644 --- a/erpnext/docs/user/manual/en/schools/setup/index.txt +++ b/erpnext/docs/user/manual/en/education/setup/index.txt @@ -6,4 +6,4 @@ student-category student-batch-name academic-term academic-year -school-settings \ No newline at end of file +education-settings \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/setup/instructor.md b/erpnext/docs/user/manual/en/education/setup/instructor.md similarity index 65% rename from erpnext/docs/user/manual/en/schools/setup/instructor.md rename to erpnext/docs/user/manual/en/education/setup/instructor.md index 6150f025fe7..2b53ce13fe9 100644 --- a/erpnext/docs/user/manual/en/schools/setup/instructor.md +++ b/erpnext/docs/user/manual/en/education/setup/instructor.md @@ -4,14 +4,14 @@ An instructoe is a teacher, or professor, of a specialised subject that involves You can create an Instructor and link it to the Employee master and a Departmemt. -Instructor +Instructor An **Instructor** is further linked to a **Course Schedule**, where you can define the schedule for a **Course** for a give date and **Room no**. -Instructor +Instructor It is also linked to **Student group** where an **Instructor** is assigned to the Student group. -Instructor +Instructor An **Instructor** is also linked to an **Assesment Plan** for a Student group. The Instructor can be an Examiner or the supervisor for the assesment. diff --git a/erpnext/docs/user/manual/en/schools/setup/program.md b/erpnext/docs/user/manual/en/education/setup/program.md similarity index 70% rename from erpnext/docs/user/manual/en/schools/setup/program.md rename to erpnext/docs/user/manual/en/education/setup/program.md index be10166e7be..25e390eb87b 100644 --- a/erpnext/docs/user/manual/en/schools/setup/program.md +++ b/erpnext/docs/user/manual/en/education/setup/program.md @@ -4,15 +4,15 @@ An educational program is a program written by the institutions which determines To create a Program go to : -###Schools >> 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. -Program +Program Add the relevant Course and the Fee details for a program. -Program +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. diff --git a/erpnext/docs/user/manual/en/schools/setup/room.md b/erpnext/docs/user/manual/en/education/setup/room.md similarity index 72% rename from erpnext/docs/user/manual/en/schools/setup/room.md rename to erpnext/docs/user/manual/en/education/setup/room.md index 43ddde92245..6a1f32e9ff4 100644 --- a/erpnext/docs/user/manual/en/schools/setup/room.md +++ b/erpnext/docs/user/manual/en/education/setup/room.md @@ -4,14 +4,14 @@ A classroom is a space (room or lab) where you want to schedule courses or exami The Room doctype allows you to record the room number and the seating capacity for a classroom. Once a room is created Course schedule link is provided in the Room doctype to view or add the course schedule for the classroom. -Room +Room The course schedule validate the availability of the Room number and an alert message is shown if there is an overlap for the Room number for a given time slot. -Room +Room The Room number is further linked to the Assesment plan. It validates the availability of examination room for the assessment to be held for a given date and time. -Room +Room {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 new file mode 100644 index 00000000000..44f9c44ed11 --- /dev/null +++ b/erpnext/docs/user/manual/en/education/setup/school-settings.md @@ -0,0 +1,15 @@ +# Education Settings + +The Education Settings page allow you to setup basic settings like **Academic Year and Term** for the educational setup. + +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** + +Student + +You can enable the validation of Course for every Student from the enrolled Courses in Program Enrollment,for Course based Student Group by checking the settings for **Validate Enrolled Course for Students in Student Group** + +Student + +{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/setup/student-batch-name.md b/erpnext/docs/user/manual/en/education/setup/student-batch-name.md similarity index 80% rename from erpnext/docs/user/manual/en/schools/setup/student-batch-name.md rename to erpnext/docs/user/manual/en/education/setup/student-batch-name.md index 056f9108636..3b5ad41edd5 100644 --- a/erpnext/docs/user/manual/en/schools/setup/student-batch-name.md +++ b/erpnext/docs/user/manual/en/education/setup/student-batch-name.md @@ -2,7 +2,7 @@ Student batch is a collection of students from Student Groups. **Student batch** allows you to create **Student Group** based on a batch. When a student is enrolled for a **Program**, the Student batch is selected to enroll the student for the given Program and batch -Student +Student You can also get a **Student Batch-Wise Attendance** report to view the number of student present from the Batch. diff --git a/erpnext/docs/user/manual/en/schools/setup/student-category.md b/erpnext/docs/user/manual/en/education/setup/student-category.md similarity index 78% rename from erpnext/docs/user/manual/en/schools/setup/student-category.md rename to erpnext/docs/user/manual/en/education/setup/student-category.md index 0d769279727..cb5cbeae388 100644 --- a/erpnext/docs/user/manual/en/schools/setup/student-category.md +++ b/erpnext/docs/user/manual/en/education/setup/student-category.md @@ -6,7 +6,7 @@ To create Student category go to Setup >> Student Category >> New. We can create new student category by adding a name and save it -Student +Student {next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/student/__init__.py b/erpnext/docs/user/manual/en/education/student/__init__.py similarity index 100% rename from erpnext/docs/user/manual/en/schools/student/__init__.py rename to erpnext/docs/user/manual/en/education/student/__init__.py diff --git a/erpnext/docs/user/manual/en/schools/student/guardian.md b/erpnext/docs/user/manual/en/education/student/guardian.md similarity index 68% rename from erpnext/docs/user/manual/en/schools/student/guardian.md rename to erpnext/docs/user/manual/en/education/student/guardian.md index 7bbdbc22c5c..ca34e8b7657 100644 --- a/erpnext/docs/user/manual/en/schools/student/guardian.md +++ b/erpnext/docs/user/manual/en/education/student/guardian.md @@ -2,7 +2,7 @@ The Guardian doctype allows you to record the guardian details for a **Student**. -Student +Student The email id added in the **Guardian** detail can be linked to a email group for sending newsletter or announcements. diff --git a/erpnext/docs/user/manual/en/schools/student/index.md b/erpnext/docs/user/manual/en/education/student/index.md similarity index 100% rename from erpnext/docs/user/manual/en/schools/student/index.md rename to erpnext/docs/user/manual/en/education/student/index.md diff --git a/erpnext/docs/user/manual/en/schools/student/index.txt b/erpnext/docs/user/manual/en/education/student/index.txt similarity index 100% rename from erpnext/docs/user/manual/en/schools/student/index.txt rename to erpnext/docs/user/manual/en/education/student/index.txt diff --git a/erpnext/docs/user/manual/en/schools/student/student-batch.md b/erpnext/docs/user/manual/en/education/student/student-batch.md similarity index 80% rename from erpnext/docs/user/manual/en/schools/student/student-batch.md rename to erpnext/docs/user/manual/en/education/student/student-batch.md index 056f9108636..3b5ad41edd5 100644 --- a/erpnext/docs/user/manual/en/schools/student/student-batch.md +++ b/erpnext/docs/user/manual/en/education/student/student-batch.md @@ -2,7 +2,7 @@ Student batch is a collection of students from Student Groups. **Student batch** allows you to create **Student Group** based on a batch. When a student is enrolled for a **Program**, the Student batch is selected to enroll the student for the given Program and batch -Student +Student You can also get a **Student Batch-Wise Attendance** report to view the number of student present from the Batch. diff --git a/erpnext/docs/user/manual/en/schools/student/student-group-creation-tool.md b/erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md similarity index 82% rename from erpnext/docs/user/manual/en/schools/student/student-group-creation-tool.md rename to erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md index 1cd9b1e796f..aeedd97a2e5 100644 --- a/erpnext/docs/user/manual/en/schools/student/student-group-creation-tool.md +++ b/erpnext/docs/user/manual/en/education/student/student-group-creation-tool.md @@ -4,11 +4,11 @@ The Student group creation tool allows you to create student groups in bulk. To create Student group using this tool go to -##Schools >>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. -Student Group Creation Tool +Student Group Creation Tool By default the student group is created based on the **Course** only. The check box for "Separate course based Group for every Batch" allows you to create batchwise Student groups for a course. diff --git a/erpnext/docs/user/manual/en/schools/student/student-group.md b/erpnext/docs/user/manual/en/education/student/student-group.md similarity index 88% rename from erpnext/docs/user/manual/en/schools/student/student-group.md rename to erpnext/docs/user/manual/en/education/student/student-group.md index cf3f82c5a2d..467fb3e84e6 100644 --- a/erpnext/docs/user/manual/en/schools/student/student-group.md +++ b/erpnext/docs/user/manual/en/education/student/student-group.md @@ -6,15 +6,15 @@ A Student Group needs to be created for every course for **Academic Term** and * To create a Student Group go to: -Schools >> 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. Once a student group is created you can mark attendance for the group. -Student Group +Student 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. diff --git a/erpnext/docs/user/manual/en/schools/student/student-log.md b/erpnext/docs/user/manual/en/education/student/student-log.md similarity index 72% rename from erpnext/docs/user/manual/en/schools/student/student-log.md rename to erpnext/docs/user/manual/en/education/student/student-log.md index 160e39fcdc4..5c113e4650d 100644 --- a/erpnext/docs/user/manual/en/schools/student/student-log.md +++ b/erpnext/docs/user/manual/en/education/student/student-log.md @@ -4,6 +4,6 @@ The Student log Doctype enables you to add and edit addtional information for a You can make a note of student activities using Student log. Logs can be categorised as 'General', 'Academic', 'Medical' or 'Achievement' -Student +Student {next} diff --git a/erpnext/docs/user/manual/en/schools/student/student.md b/erpnext/docs/user/manual/en/education/student/student.md similarity index 83% rename from erpnext/docs/user/manual/en/schools/student/student.md rename to erpnext/docs/user/manual/en/education/student/student.md index 09e44714e68..fce5d7ba8a8 100644 --- a/erpnext/docs/user/manual/en/schools/student/student.md +++ b/erpnext/docs/user/manual/en/education/student/student.md @@ -3,7 +3,7 @@ A Student is a person who has enrolled at your institute and you have accepted their application. The Student doctype maintains detials like personal information, date of birth, address etc. It also records the **Guardian** and sibling details. -Student +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 diff --git a/erpnext/docs/user/manual/en/index.txt b/erpnext/docs/user/manual/en/index.txt index 712ab8eabd3..34bb24e0d6f 100644 --- a/erpnext/docs/user/manual/en/index.txt +++ b/erpnext/docs/user/manual/en/index.txt @@ -15,3 +15,4 @@ website using-erpnext regional customize-erpnext +education diff --git a/erpnext/docs/user/manual/en/schools/fees/fees.md b/erpnext/docs/user/manual/en/schools/fees/fees.md deleted file mode 100644 index f17720ce85e..00000000000 --- a/erpnext/docs/user/manual/en/schools/fees/fees.md +++ /dev/null @@ -1,8 +0,0 @@ -# Fees - -Maintain a record of fees collected from students. -The [Fee Structure](/docs/user/manual/en/schools/fees/fee-structure.html) is fetched based on the selected Program and Academic Term. - -Fees - -{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/index.md b/erpnext/docs/user/manual/en/schools/index.md deleted file mode 100644 index d317d39bfaa..00000000000 --- a/erpnext/docs/user/manual/en/schools/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# Schools - - -The School Modules in ERPNext is designed to meet requirements of Schools, Colleges & Educational Institutes. This is a centralized system, which maintains and updates all the activities related to an Institution. This will ease the process of each and every aspect of a School, be it Students, Admission, Examination and Fee. - -Fees Section - -{index} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/setup/index.md b/erpnext/docs/user/manual/en/schools/setup/index.md deleted file mode 100644 index 4e0915277b7..00000000000 --- a/erpnext/docs/user/manual/en/schools/setup/index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Setup - -The Setup section of Schools module provides facility to make some basic configuration. Below are doctypes for basic configuration. - -Setup Section - -### Topics - -{index} \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/schools/setup/school-settings.md b/erpnext/docs/user/manual/en/schools/setup/school-settings.md deleted file mode 100644 index ce9e9144b7a..00000000000 --- a/erpnext/docs/user/manual/en/schools/setup/school-settings.md +++ /dev/null @@ -1,15 +0,0 @@ -#School Settings - -The Schools settings page allow you to setup basic settings like **Academic Year and Term** for the Schools setup. - -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** - -Student - -You can enable the validation of Course for every Student from the enrolled Courses in Program Enrollment,for Course based Student Group by checking the settings for **Validate Enrolled Course for Students in Student Group** - -Student - -{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/schools/Assessment/__init__.py b/erpnext/docs/user/manual/es/education/Assessment/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/Assessment/__init__.py rename to erpnext/docs/user/manual/es/education/Assessment/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/Assessment/assessment_criteria.md b/erpnext/docs/user/manual/es/education/Assessment/assessment_criteria.md similarity index 85% rename from erpnext/docs/user/manual/es/schools/Assessment/assessment_criteria.md rename to erpnext/docs/user/manual/es/education/Assessment/assessment_criteria.md index 92f338fd8b6..31e710a309b 100644 --- a/erpnext/docs/user/manual/es/schools/Assessment/assessment_criteria.md +++ b/erpnext/docs/user/manual/es/education/Assessment/assessment_criteria.md @@ -2,12 +2,12 @@ Criterios de evaluación es el parámetro basado en el que se evalúa el estudiante. -Assessment Criteria +Assessment Criteria Después de la evaluación para un curso, las calificaciones obtenidas se ingresan en base a los criterios de evaluación. Por ejemplo, si la evaluación se llevó a cabo para el tema de la ciencia, entonces usted puede evaluar al estudiante en ciencia en varios criterios como la escritura, prácticas, presentación, etc Los Criterios de Evaluación se usan al programar el Plan de Evaluación para el Grupo de Estudiantes y el Curso. -Assessment Plan Criteria +Assessment Plan Criteria {next} diff --git a/erpnext/docs/user/manual/es/schools/Assessment/assessment_group.md b/erpnext/docs/user/manual/es/education/Assessment/assessment_group.md similarity index 82% rename from erpnext/docs/user/manual/es/schools/Assessment/assessment_group.md rename to erpnext/docs/user/manual/es/education/Assessment/assessment_group.md index 7102888f289..aaabda1aaa1 100644 --- a/erpnext/docs/user/manual/es/schools/Assessment/assessment_group.md +++ b/erpnext/docs/user/manual/es/education/Assessment/assessment_group.md @@ -4,10 +4,10 @@ La estructura del grupo de evaluación es un maestro donde se puede definir la j Por ejemplo, si realiza dos evaluaciones en un año académico, configure el Grupo de evaluación de la siguiente manera. -Assessment Group Term +Assessment Group Term En la misma línea, también puede definir varios Grupo de Evaluación basado sobre la evaluación llevada a cabo en su instituto. -Assessment Group Term +Assessment Group Term {next} diff --git a/erpnext/docs/user/manual/es/schools/Assessment/assessment_plan.md b/erpnext/docs/user/manual/es/education/Assessment/assessment_plan.md similarity index 84% rename from erpnext/docs/user/manual/es/schools/Assessment/assessment_plan.md rename to erpnext/docs/user/manual/es/education/Assessment/assessment_plan.md index 9d66c213f80..566189241fa 100644 --- a/erpnext/docs/user/manual/es/schools/Assessment/assessment_plan.md +++ b/erpnext/docs/user/manual/es/education/Assessment/assessment_plan.md @@ -10,10 +10,10 @@ Para programar una evaluación/examinación para un Grupo de Estudiantes, para u 4. Examinador y Supervisor -Assessment Plan Details +Assessment Plan Details 5. Los Criterios de Evaluación son la lista de criterios basados ​​en que cada estudiante en será evaluado y los grados serán asignados. -Assessment Plan Criteria +Assessment Plan Criteria {next} diff --git a/erpnext/docs/user/manual/es/schools/Assessment/assessment_result.md b/erpnext/docs/user/manual/es/education/Assessment/assessment_result.md similarity index 75% rename from erpnext/docs/user/manual/es/schools/Assessment/assessment_result.md rename to erpnext/docs/user/manual/es/education/Assessment/assessment_result.md index 2d9409708d2..67a6f9a5096 100644 --- a/erpnext/docs/user/manual/es/schools/Assessment/assessment_result.md +++ b/erpnext/docs/user/manual/es/education/Assessment/assessment_result.md @@ -1,7 +1,7 @@ #Resultados de Evaluación -El resultado de la evaluación es un registro de las calificaciones obtenidas por el estudiante para una evaluación específica. El resultado de la evaluación se crea en el backend en base a los puntos en [Herramienta de Resultados de Evaluación](/docs/user/manual/es/schools/assessment/assessment_result_tool.html). +El resultado de la evaluación es un registro de las calificaciones obtenidas por el estudiante para una evaluación específica. El resultado de la evaluación se crea en el backend en base a los puntos en [Herramienta de Resultados de Evaluación](/docs/user/manual/es/education/assessment/assessment_result_tool.html). -Assessment Result +Assessment Result {next} diff --git a/erpnext/docs/user/manual/es/schools/Assessment/assessment_result_tool.md b/erpnext/docs/user/manual/es/education/Assessment/assessment_result_tool.md similarity index 92% rename from erpnext/docs/user/manual/es/schools/Assessment/assessment_result_tool.md rename to erpnext/docs/user/manual/es/education/Assessment/assessment_result_tool.md index 70e4ee3f2ff..a6a44e5bee1 100644 --- a/erpnext/docs/user/manual/es/schools/Assessment/assessment_result_tool.md +++ b/erpnext/docs/user/manual/es/education/Assessment/assessment_result_tool.md @@ -3,7 +3,7 @@ Herramienta de resultados de evaluación le ayuda a ingresar las calificaciones obtenidas por los estudiantes para un curso específico. En esta herramienta, basada en el plan de evaluación, todos los estudiantes van a ser filtrados dentro de la herramienta de resultados de la evaluación. También, Columnas para los Criterios de Evaluación serán donde las calificaciones ganadas pueden ser ingresadas para cada Estudiante. -Assessment Result Tool +Assessment Result Tool A medida que vaya introduciendo las notas para un Estudiante y cambie al siguiente alumno, en el backend, el registro de Resultados del Estudiante se creará automáticamente para ese Estudiante. diff --git a/erpnext/docs/user/manual/es/schools/Assessment/grading_scale.md b/erpnext/docs/user/manual/es/education/Assessment/grading_scale.md similarity index 87% rename from erpnext/docs/user/manual/es/schools/Assessment/grading_scale.md rename to erpnext/docs/user/manual/es/education/Assessment/grading_scale.md index 9107f92a569..bf362b4dac8 100644 --- a/erpnext/docs/user/manual/es/schools/Assessment/grading_scale.md +++ b/erpnext/docs/user/manual/es/education/Assessment/grading_scale.md @@ -2,6 +2,6 @@ En la escala de calificación, puedes definir varios grados y límites para los estudiantes. Basado en la calificación obtenida por el estudiante en la evaluación, el grado (Grade) será asignado. -Grading Scale +Grading Scale {next} diff --git a/erpnext/docs/user/manual/es/schools/Assessment/index.md b/erpnext/docs/user/manual/es/education/Assessment/index.md similarity index 100% rename from erpnext/docs/user/manual/es/schools/Assessment/index.md rename to erpnext/docs/user/manual/es/education/Assessment/index.md diff --git a/erpnext/docs/user/manual/es/schools/Assessment/index.txt b/erpnext/docs/user/manual/es/education/Assessment/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/Assessment/index.txt rename to erpnext/docs/user/manual/es/education/Assessment/index.txt diff --git a/erpnext/docs/user/manual/es/schools/__init__.py b/erpnext/docs/user/manual/es/education/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/__init__.py rename to erpnext/docs/user/manual/es/education/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/admission/__init__.py b/erpnext/docs/user/manual/es/education/admission/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/admission/__init__.py rename to erpnext/docs/user/manual/es/education/admission/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/admission/index.md b/erpnext/docs/user/manual/es/education/admission/index.md similarity index 100% rename from erpnext/docs/user/manual/es/schools/admission/index.md rename to erpnext/docs/user/manual/es/education/admission/index.md diff --git a/erpnext/docs/user/manual/es/schools/admission/index.txt b/erpnext/docs/user/manual/es/education/admission/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/admission/index.txt rename to erpnext/docs/user/manual/es/education/admission/index.txt diff --git a/erpnext/docs/user/manual/es/schools/admission/program-enrollment.md b/erpnext/docs/user/manual/es/education/admission/program-enrollment.md similarity index 78% rename from erpnext/docs/user/manual/es/schools/admission/program-enrollment.md rename to erpnext/docs/user/manual/es/education/admission/program-enrollment.md index 34e8996a254..6a242849a83 100644 --- a/erpnext/docs/user/manual/es/schools/admission/program-enrollment.md +++ b/erpnext/docs/user/manual/es/education/admission/program-enrollment.md @@ -2,6 +2,6 @@ Este formulario te permite inscribir un estudiante a un programa. Un estudiante puede ser inscrito en multiples programas. -Student Applicant Enrollment +Student Applicant Enrollment {next} diff --git a/erpnext/docs/user/manual/es/schools/admission/student-applicant.md b/erpnext/docs/user/manual/es/education/admission/student-applicant.md similarity index 89% rename from erpnext/docs/user/manual/es/schools/admission/student-applicant.md rename to erpnext/docs/user/manual/es/education/admission/student-applicant.md index 33d8dd7b294..4d8723c20c6 100644 --- a/erpnext/docs/user/manual/es/schools/admission/student-applicant.md +++ b/erpnext/docs/user/manual/es/education/admission/student-applicant.md @@ -3,7 +3,7 @@ Un registro de Aplicación de Estudiante necesita ser creado cuando un estudiante aplica para un programa en su institución. Puedes Aprobar o Rechazar una aplicación de estudiante. Aceptando una aplicación de un estudiante puedes agregarlos al master de estudiantes. -Student Applicant +Student Applicant ### Estados de la Aplicación @@ -21,8 +21,8 @@ Puedes Aprobar o Rechazar una aplicación de estudiante. Aceptando una aplicaci Una vez aprobada una Aplicación de Estudiante, puedes inscribirlo a un programa. Cuando le das click al butón 'Inscribir', -el sistema creará un estudiante usando esa aplicación y le va a redireccionar a el [Formulario de Inscripción al Programa](/docs/user/manual/es/schools/student/program-enrollment.html). +el sistema creará un estudiante usando esa aplicación y le va a redireccionar a el [Formulario de Inscripción al Programa](/docs/user/manual/es/education/student/program-enrollment.html). -Student Applicant Enrollment +Student Applicant Enrollment {next} diff --git a/erpnext/docs/user/manual/es/schools/fees/__init__.py b/erpnext/docs/user/manual/es/education/fees/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/fees/__init__.py rename to erpnext/docs/user/manual/es/education/fees/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/fees/fee-category.md b/erpnext/docs/user/manual/es/education/fees/fee-category.md similarity index 80% rename from erpnext/docs/user/manual/es/schools/fees/fee-category.md rename to erpnext/docs/user/manual/es/education/fees/fee-category.md index c05b3f549f3..a38ba7e812d 100644 --- a/erpnext/docs/user/manual/es/schools/fees/fee-category.md +++ b/erpnext/docs/user/manual/es/education/fees/fee-category.md @@ -2,6 +2,6 @@ Todos los tipos diferentes de cuotas que se cobran -Fees Category +Fees Category {next} diff --git a/erpnext/docs/user/manual/es/schools/fees/fee-structure.md b/erpnext/docs/user/manual/es/education/fees/fee-structure.md similarity index 83% rename from erpnext/docs/user/manual/es/schools/fees/fee-structure.md rename to erpnext/docs/user/manual/es/education/fees/fee-structure.md index 1f621d716dc..6fe6af98c2e 100644 --- a/erpnext/docs/user/manual/es/schools/fees/fee-structure.md +++ b/erpnext/docs/user/manual/es/education/fees/fee-structure.md @@ -2,6 +2,6 @@ Una Estructura de Cuota es una plantilla que puede ser usada cuando se hacen registros de cuotas. -Fees Structure +Fees Structure {next} diff --git a/erpnext/docs/user/manual/es/education/fees/fees.md b/erpnext/docs/user/manual/es/education/fees/fees.md new file mode 100644 index 00000000000..5f6eee4bfd0 --- /dev/null +++ b/erpnext/docs/user/manual/es/education/fees/fees.md @@ -0,0 +1,8 @@ +# Cuotas + +Mantiene un registro de todas las cuotas recolectadas de los estudiantes. +La [Estructura de Cuota](/docs/user/manual/es/education/fees/fee-structure.html) es seleccionada basada en el programa seleccionada y los Términos Académicos. + +Fees + +{next} diff --git a/erpnext/docs/user/manual/es/schools/fees/index.md b/erpnext/docs/user/manual/es/education/fees/index.md similarity index 82% rename from erpnext/docs/user/manual/es/schools/fees/index.md rename to erpnext/docs/user/manual/es/education/fees/index.md index e88381378df..c1b5bb57ccf 100644 --- a/erpnext/docs/user/manual/es/schools/fees/index.md +++ b/erpnext/docs/user/manual/es/education/fees/index.md @@ -2,7 +2,7 @@ Esta sección contiene todos los documentos relacionado a las 'Cuota' -Fees Section +Fees Section ### Temas diff --git a/erpnext/docs/user/manual/es/schools/fees/index.txt b/erpnext/docs/user/manual/es/education/fees/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/fees/index.txt rename to erpnext/docs/user/manual/es/education/fees/index.txt diff --git a/erpnext/docs/user/manual/es/schools/index.md b/erpnext/docs/user/manual/es/education/index.md similarity index 84% rename from erpnext/docs/user/manual/es/schools/index.md rename to erpnext/docs/user/manual/es/education/index.md index a1824dc6e86..feca8303c0d 100644 --- a/erpnext/docs/user/manual/es/schools/index.md +++ b/erpnext/docs/user/manual/es/education/index.md @@ -1,8 +1,8 @@ -# Schools +# Education Los módulos de School estan diseñados para satisfacer los requerimientos de Escuelas, Colegios e Institutos Educacionales. -Fees Section +Fees Section {index} diff --git a/erpnext/docs/user/manual/es/schools/index.txt b/erpnext/docs/user/manual/es/education/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/index.txt rename to erpnext/docs/user/manual/es/education/index.txt diff --git a/erpnext/docs/user/manual/es/schools/schedule/__init__.py b/erpnext/docs/user/manual/es/education/schedule/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/schedule/__init__.py rename to erpnext/docs/user/manual/es/education/schedule/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/schedule/course-schedule.md b/erpnext/docs/user/manual/es/education/schedule/course-schedule.md similarity index 86% rename from erpnext/docs/user/manual/es/schools/schedule/course-schedule.md rename to erpnext/docs/user/manual/es/education/schedule/course-schedule.md index 629c828451d..7bf40ffacf7 100644 --- a/erpnext/docs/user/manual/es/schools/schedule/course-schedule.md +++ b/erpnext/docs/user/manual/es/education/schedule/course-schedule.md @@ -3,13 +3,13 @@ El Horario de Curso es el horario de una sesión de un profesor para un Curso en particular. Puedes ver un resumen del horario del curso en la vista de Calendario. -Course Schedule +Course Schedule ### Marcando asistencia Puedes pasar la asistencia para un grupo de estudiantes usando el Horario de Curso. -Course Schedule Attendance +Course Schedule Attendance - Para hacer la asistencia, expandir la sección de asistencia. - Selecciona los estudiantes que estaban presentes para esa sesión. @@ -20,6 +20,6 @@ Puedes pasar la asistencia para un grupo de estudiantes usando el Horario de Cur Una vez hayas marcado la asistencia usando la sección de asistencia en el Horario de un Curso, esta sección debería estar oculta. Un botón de Ver Asistencia debería aparecer. Click en el botón para ver todos los registros de asistencia creados para ese Horario de Curso. -Course Schedule Attendance +Course Schedule Attendance {next} diff --git a/erpnext/docs/user/manual/es/schools/schedule/examination.md b/erpnext/docs/user/manual/es/education/schedule/examination.md similarity index 85% rename from erpnext/docs/user/manual/es/schools/schedule/examination.md rename to erpnext/docs/user/manual/es/education/schedule/examination.md index 5f85aedd413..b8cef3e9776 100644 --- a/erpnext/docs/user/manual/es/schools/schedule/examination.md +++ b/erpnext/docs/user/manual/es/education/schedule/examination.md @@ -2,7 +2,7 @@ El registro de examinación puede ser usado para hacer el seguimiento del horario de los examenes y los resultados de los mismos. -Examination +Examination {next} diff --git a/erpnext/docs/user/manual/es/schools/schedule/index.md b/erpnext/docs/user/manual/es/education/schedule/index.md similarity index 66% rename from erpnext/docs/user/manual/es/schools/schedule/index.md rename to erpnext/docs/user/manual/es/education/schedule/index.md index f9c2c3b5d12..016aa1009a0 100644 --- a/erpnext/docs/user/manual/es/schools/schedule/index.md +++ b/erpnext/docs/user/manual/es/education/schedule/index.md @@ -1,6 +1,6 @@ # Horario -Schedule Section +Schedule Section ### Temas diff --git a/erpnext/docs/user/manual/es/schools/schedule/index.txt b/erpnext/docs/user/manual/es/education/schedule/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/schedule/index.txt rename to erpnext/docs/user/manual/es/education/schedule/index.txt diff --git a/erpnext/docs/user/manual/es/schools/schedule/scheduling-tool.md b/erpnext/docs/user/manual/es/education/schedule/scheduling-tool.md similarity index 96% rename from erpnext/docs/user/manual/es/schools/schedule/scheduling-tool.md rename to erpnext/docs/user/manual/es/education/schedule/scheduling-tool.md index 070a0354ec6..55ff425c7f2 100644 --- a/erpnext/docs/user/manual/es/schools/schedule/scheduling-tool.md +++ b/erpnext/docs/user/manual/es/education/schedule/scheduling-tool.md @@ -2,7 +2,7 @@ Esta herramienta puede ser usada para crear los Horarios de los Cursos. -Scheduling Tool +Scheduling Tool ### Creando Horarios de Cursos diff --git a/erpnext/docs/user/manual/es/schools/schedule/student-attendance.md b/erpnext/docs/user/manual/es/education/schedule/student-attendance.md similarity index 83% rename from erpnext/docs/user/manual/es/schools/schedule/student-attendance.md rename to erpnext/docs/user/manual/es/education/schedule/student-attendance.md index a06c4f276d9..53bd4e938c6 100644 --- a/erpnext/docs/user/manual/es/schools/schedule/student-attendance.md +++ b/erpnext/docs/user/manual/es/education/schedule/student-attendance.md @@ -2,6 +2,6 @@ Mantiene los registros de la asistencia del estudiante. Los registros de asistencia pueden ser creados sobre los horarios de los cursos (Course Schedules). -Student Attendance +Student Attendance {next} diff --git a/erpnext/docs/user/manual/es/schools/setup/__init__.py b/erpnext/docs/user/manual/es/education/setup/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/setup/__init__.py rename to erpnext/docs/user/manual/es/education/setup/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/setup/academic-term.md b/erpnext/docs/user/manual/es/education/setup/academic-term.md similarity index 71% rename from erpnext/docs/user/manual/es/schools/setup/academic-term.md rename to erpnext/docs/user/manual/es/education/setup/academic-term.md index 83af58ac314..7a6b4056070 100644 --- a/erpnext/docs/user/manual/es/schools/setup/academic-term.md +++ b/erpnext/docs/user/manual/es/education/setup/academic-term.md @@ -1,6 +1,6 @@ # Término Académico -Academic Term +Academic Term {next} diff --git a/erpnext/docs/user/manual/es/schools/setup/academic-year.md b/erpnext/docs/user/manual/es/education/setup/academic-year.md similarity index 70% rename from erpnext/docs/user/manual/es/schools/setup/academic-year.md rename to erpnext/docs/user/manual/es/education/setup/academic-year.md index 56a46f9c390..7fe2a8f5f20 100644 --- a/erpnext/docs/user/manual/es/schools/setup/academic-year.md +++ b/erpnext/docs/user/manual/es/education/setup/academic-year.md @@ -1,5 +1,5 @@ # Año Académico -Academic Year +Academic Year {next} diff --git a/erpnext/docs/user/manual/es/education/setup/course.md b/erpnext/docs/user/manual/es/education/setup/course.md new file mode 100644 index 00000000000..fbbce625fd6 --- /dev/null +++ b/erpnext/docs/user/manual/es/education/setup/course.md @@ -0,0 +1,5 @@ +# Curso + +Course + +{next} diff --git a/erpnext/docs/user/manual/es/schools/setup/index.md b/erpnext/docs/user/manual/es/education/setup/index.md similarity index 72% rename from erpnext/docs/user/manual/es/schools/setup/index.md rename to erpnext/docs/user/manual/es/education/setup/index.md index 070db540155..59df99502e0 100644 --- a/erpnext/docs/user/manual/es/schools/setup/index.md +++ b/erpnext/docs/user/manual/es/education/setup/index.md @@ -1,6 +1,6 @@ # Configuración -Setup Section +Setup Section ### Temas diff --git a/erpnext/docs/user/manual/es/schools/setup/index.txt b/erpnext/docs/user/manual/es/education/setup/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/setup/index.txt rename to erpnext/docs/user/manual/es/education/setup/index.txt diff --git a/erpnext/docs/user/manual/es/education/setup/instructor.md b/erpnext/docs/user/manual/es/education/setup/instructor.md new file mode 100644 index 00000000000..4812c15856e --- /dev/null +++ b/erpnext/docs/user/manual/es/education/setup/instructor.md @@ -0,0 +1,5 @@ +# Instructor + +Instructor + +{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/education/setup/program.md b/erpnext/docs/user/manual/es/education/setup/program.md new file mode 100644 index 00000000000..123605786a1 --- /dev/null +++ b/erpnext/docs/user/manual/es/education/setup/program.md @@ -0,0 +1,5 @@ +# Programa + +Program + +{next} diff --git a/erpnext/docs/user/manual/es/education/setup/room.md b/erpnext/docs/user/manual/es/education/setup/room.md new file mode 100644 index 00000000000..7750dcfabb0 --- /dev/null +++ b/erpnext/docs/user/manual/es/education/setup/room.md @@ -0,0 +1,6 @@ +# Aula + + +Room + +{next} diff --git a/erpnext/docs/user/manual/es/schools/student/__init__.py b/erpnext/docs/user/manual/es/education/student/__init__.py similarity index 100% rename from erpnext/docs/user/manual/es/schools/student/__init__.py rename to erpnext/docs/user/manual/es/education/student/__init__.py diff --git a/erpnext/docs/user/manual/es/schools/student/index.md b/erpnext/docs/user/manual/es/education/student/index.md similarity index 100% rename from erpnext/docs/user/manual/es/schools/student/index.md rename to erpnext/docs/user/manual/es/education/student/index.md diff --git a/erpnext/docs/user/manual/es/schools/student/index.txt b/erpnext/docs/user/manual/es/education/student/index.txt similarity index 100% rename from erpnext/docs/user/manual/es/schools/student/index.txt rename to erpnext/docs/user/manual/es/education/student/index.txt diff --git a/erpnext/docs/user/manual/es/schools/student/student-batch.md b/erpnext/docs/user/manual/es/education/student/student-batch.md similarity index 55% rename from erpnext/docs/user/manual/es/schools/student/student-batch.md rename to erpnext/docs/user/manual/es/education/student/student-batch.md index 4d5a17e671c..bb7c9d56fba 100644 --- a/erpnext/docs/user/manual/es/schools/student/student-batch.md +++ b/erpnext/docs/user/manual/es/education/student/student-batch.md @@ -3,6 +3,6 @@ Un lote de estudiantes es una colección de estudiantes desde los Grupos de Estudiantes. -Student +Student {next} diff --git a/erpnext/docs/user/manual/es/schools/student/student-group-creation-tool.md b/erpnext/docs/user/manual/es/education/student/student-group-creation-tool.md similarity index 77% rename from erpnext/docs/user/manual/es/schools/student/student-group-creation-tool.md rename to erpnext/docs/user/manual/es/education/student/student-group-creation-tool.md index 2102c34de96..942fadfce78 100644 --- a/erpnext/docs/user/manual/es/schools/student/student-group-creation-tool.md +++ b/erpnext/docs/user/manual/es/education/student/student-group-creation-tool.md @@ -3,6 +3,6 @@ Esta herramienta te permite crear grupos de estudiantes. Puedes especificar multiples parámetros para crearlos. -Student Group Creation Tool +Student Group Creation Tool {next} diff --git a/erpnext/docs/user/manual/es/schools/student/student-group.md b/erpnext/docs/user/manual/es/education/student/student-group.md similarity index 90% rename from erpnext/docs/user/manual/es/schools/student/student-group.md rename to erpnext/docs/user/manual/es/education/student/student-group.md index f5841cc0608..59dfcbc2758 100644 --- a/erpnext/docs/user/manual/es/schools/student/student-group.md +++ b/erpnext/docs/user/manual/es/education/student/student-group.md @@ -3,6 +3,6 @@ Un Grupo de Estudiante es una colección de estudiantes tomando el mismo curso. Puedes crear calendarios para los cursos y examinaciones para un Grupo de Estudiante. Un Grupo de Estudiante necesita ser creado para cada curso en un año o término académico en particular. -Student Group +Student Group {next} diff --git a/erpnext/docs/user/manual/es/schools/student/student-log.md b/erpnext/docs/user/manual/es/education/student/student-log.md similarity index 71% rename from erpnext/docs/user/manual/es/schools/student/student-log.md rename to erpnext/docs/user/manual/es/education/student/student-log.md index 296b867c601..e5a5e2cb4ff 100644 --- a/erpnext/docs/user/manual/es/schools/student/student-log.md +++ b/erpnext/docs/user/manual/es/education/student/student-log.md @@ -3,6 +3,6 @@ Puedes crear una nota de una actividad de un estudiante usando la bitácora de estudiante (log) Los registros de bitágora pueden ser categorizadas como 'General', 'Academic', 'Medical' or 'Achievement' -Student +Student {next} diff --git a/erpnext/docs/user/manual/es/schools/student/student.md b/erpnext/docs/user/manual/es/education/student/student.md similarity index 78% rename from erpnext/docs/user/manual/es/schools/student/student.md rename to erpnext/docs/user/manual/es/education/student/student.md index fee84c5c4c7..21724a71b98 100644 --- a/erpnext/docs/user/manual/es/schools/student/student.md +++ b/erpnext/docs/user/manual/es/education/student/student.md @@ -5,6 +5,6 @@ El doctype de Estudiante mantiene los detalles personales de los estudiantes. Puedes ver todo lo relacionado a un estudiante en particular en esta página. Ejemplo: Pagos, Grupo de Estudiante, etc. -Student +Student {next} diff --git a/erpnext/docs/user/manual/es/index.txt b/erpnext/docs/user/manual/es/index.txt index 00cf97b420c..ad85a791d72 100644 --- a/erpnext/docs/user/manual/es/index.txt +++ b/erpnext/docs/user/manual/es/index.txt @@ -1,4 +1,4 @@ introduction accounts projects -schools +education diff --git a/erpnext/docs/user/manual/es/schools/fees/fees.md b/erpnext/docs/user/manual/es/schools/fees/fees.md deleted file mode 100644 index d6b74dc300a..00000000000 --- a/erpnext/docs/user/manual/es/schools/fees/fees.md +++ /dev/null @@ -1,8 +0,0 @@ -# Cuotas - -Mantiene un registro de todas las cuotas recolectadas de los estudiantes. -La [Estructura de Cuota](/docs/user/manual/es/schools/fees/fee-structure.html) es seleccionada basada en el programa seleccionada y los Términos Académicos. - -Fees - -{next} diff --git a/erpnext/docs/user/manual/es/schools/setup/course.md b/erpnext/docs/user/manual/es/schools/setup/course.md deleted file mode 100644 index 799f9b46e11..00000000000 --- a/erpnext/docs/user/manual/es/schools/setup/course.md +++ /dev/null @@ -1,5 +0,0 @@ -# Curso - -Course - -{next} diff --git a/erpnext/docs/user/manual/es/schools/setup/instructor.md b/erpnext/docs/user/manual/es/schools/setup/instructor.md deleted file mode 100644 index 1a4d35161c2..00000000000 --- a/erpnext/docs/user/manual/es/schools/setup/instructor.md +++ /dev/null @@ -1,5 +0,0 @@ -# Instructor - -Instructor - -{next} \ No newline at end of file diff --git a/erpnext/docs/user/manual/es/schools/setup/program.md b/erpnext/docs/user/manual/es/schools/setup/program.md deleted file mode 100644 index 78895c58068..00000000000 --- a/erpnext/docs/user/manual/es/schools/setup/program.md +++ /dev/null @@ -1,5 +0,0 @@ -# Programa - -Program - -{next} diff --git a/erpnext/docs/user/manual/es/schools/setup/room.md b/erpnext/docs/user/manual/es/schools/setup/room.md deleted file mode 100644 index 92a4de77afe..00000000000 --- a/erpnext/docs/user/manual/es/schools/setup/room.md +++ /dev/null @@ -1,6 +0,0 @@ -# Aula - - -Room - -{next} diff --git a/erpnext/docs/user/videos/learn/education.md b/erpnext/docs/user/videos/learn/education.md new file mode 100644 index 00000000000..24b0cd03faf --- /dev/null +++ b/erpnext/docs/user/videos/learn/education.md @@ -0,0 +1,7 @@ +# ERPNext for Education + + + +**Duration: 39:21** + +This video is a recording of a webinar on how education institutes can use ERPNext Education module. It covers management of Student Applications, managing masters like Students, Programs and Courses. Also, you can manage processes like Course Scheduling, Student Assessment, Fees and Attendance. \ No newline at end of file diff --git a/erpnext/docs/user/videos/learn/index.md b/erpnext/docs/user/videos/learn/index.md index dad5cc0fefb..3bdf3055f57 100644 --- a/erpnext/docs/user/videos/learn/index.md +++ b/erpnext/docs/user/videos/learn/index.md @@ -27,8 +27,8 @@ ERPNext for Retailers 39:21 -
  • - ERPNext for Schools +
  • + ERPNext for Education 39:21
  • diff --git a/erpnext/docs/user/videos/learn/schools.md b/erpnext/docs/user/videos/learn/schools.md deleted file mode 100644 index 3553a533d6f..00000000000 --- a/erpnext/docs/user/videos/learn/schools.md +++ /dev/null @@ -1,7 +0,0 @@ -# ERPNext for Schools - - - -**Duration: 39:21** - -This video is a recording of a webinar on how education institutes can use ERPNext Schools module. It covers management of Student Applications, managing masters like Students, Programs and Courses. Also, you can manage processes like Course Scheduling, Student Assessment, Fees and Attendance. \ No newline at end of file diff --git a/erpnext/domains/education.py b/erpnext/domains/education.py index 7a86c764c81..eed35459079 100644 --- a/erpnext/domains/education.py +++ b/erpnext/domains/education.py @@ -8,7 +8,9 @@ data = { 'Fees', 'Task', 'ToDo', - 'Schools' + 'Education', + 'Student Attendance Tool', + 'Student Applicant' ], 'default_portal_role': 'Student', 'restricted_roles': [ @@ -17,21 +19,8 @@ data = { 'Academics User' ], 'modules': [ - 'Schools' + 'Education' ], - 'fixtures': [ - dict(doctype='Academic Year', academic_year_name='2013-14'), - dict(doctype='Academic Year', academic_year_name='2014-15'), - dict(doctype='Academic Year', academic_year_name='2015-16'), - dict(doctype='Academic Year', academic_year_name='2016-17'), - dict(doctype='Academic Year', academic_year_name='2017-18'), - dict(doctype='Academic Year', academic_year_name='2018-19'), - dict(doctype='Academic Year', academic_year_name='2019-20'), - dict(doctype='Academic Term', academic_year='2016-17', term_name='Semester 1'), - dict(doctype='Academic Term', academic_year='2016-17', term_name='Semester 2'), - dict(doctype='Academic Term', academic_year='2016-17', term_name='Semester 3'), - dict(doctype='Academic Term', academic_year='2017-18', term_name='Semester 1'), - dict(doctype='Academic Term', academic_year='2017-18', term_name='Semester 2'), - dict(doctype='Academic Term', academic_year='2017-18', term_name='Semester 3') - ] + 'on_setup': 'erpnext.education.setup.setup_education' + } \ No newline at end of file diff --git a/erpnext/schools/__init__.py b/erpnext/education/__init__.py similarity index 100% rename from erpnext/schools/__init__.py rename to erpnext/education/__init__.py diff --git a/erpnext/schools/api.py b/erpnext/education/api.py similarity index 100% rename from erpnext/schools/api.py rename to erpnext/education/api.py diff --git a/erpnext/schools/doctype/__init__.py b/erpnext/education/doctype/__init__.py similarity index 100% rename from erpnext/schools/doctype/__init__.py rename to erpnext/education/doctype/__init__.py diff --git a/erpnext/schools/doctype/academic_term/__init__.py b/erpnext/education/doctype/academic_term/__init__.py similarity index 100% rename from erpnext/schools/doctype/academic_term/__init__.py rename to erpnext/education/doctype/academic_term/__init__.py diff --git a/erpnext/schools/doctype/academic_term/academic_term.js b/erpnext/education/doctype/academic_term/academic_term.js similarity index 100% rename from erpnext/schools/doctype/academic_term/academic_term.js rename to erpnext/education/doctype/academic_term/academic_term.js diff --git a/erpnext/schools/doctype/academic_term/academic_term.json b/erpnext/education/doctype/academic_term/academic_term.json similarity index 98% rename from erpnext/schools/doctype/academic_term/academic_term.json rename to erpnext/education/doctype/academic_term/academic_term.json index b4eb83da486..06c5b1acfc2 100644 --- a/erpnext/schools/doctype/academic_term/academic_term.json +++ b/erpnext/education/doctype/academic_term/academic_term.json @@ -175,9 +175,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:45.897056", + "modified": "2017-11-10 19:05:58.567627", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Academic Term", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/academic_term/academic_term.py b/erpnext/education/doctype/academic_term/academic_term.py similarity index 100% rename from erpnext/schools/doctype/academic_term/academic_term.py rename to erpnext/education/doctype/academic_term/academic_term.py diff --git a/erpnext/schools/doctype/academic_term/test_academic_term.js b/erpnext/education/doctype/academic_term/test_academic_term.js similarity index 89% rename from erpnext/schools/doctype/academic_term/test_academic_term.js rename to erpnext/education/doctype/academic_term/test_academic_term.js index 688ad549057..6d91e977c63 100644 --- a/erpnext/schools/doctype/academic_term/test_academic_term.js +++ b/erpnext/education/doctype/academic_term/test_academic_term.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in Education +QUnit.module('education'); QUnit.test('Test: Academic Term', function(assert){ assert.expect(4); diff --git a/erpnext/schools/doctype/academic_term/test_academic_term.py b/erpnext/education/doctype/academic_term/test_academic_term.py similarity index 100% rename from erpnext/schools/doctype/academic_term/test_academic_term.py rename to erpnext/education/doctype/academic_term/test_academic_term.py diff --git a/erpnext/schools/doctype/academic_term/test_records.json b/erpnext/education/doctype/academic_term/test_records.json similarity index 100% rename from erpnext/schools/doctype/academic_term/test_records.json rename to erpnext/education/doctype/academic_term/test_records.json diff --git a/erpnext/schools/doctype/academic_year/__init__.py b/erpnext/education/doctype/academic_year/__init__.py similarity index 100% rename from erpnext/schools/doctype/academic_year/__init__.py rename to erpnext/education/doctype/academic_year/__init__.py diff --git a/erpnext/schools/doctype/academic_year/academic_year.js b/erpnext/education/doctype/academic_year/academic_year.js similarity index 100% rename from erpnext/schools/doctype/academic_year/academic_year.js rename to erpnext/education/doctype/academic_year/academic_year.js diff --git a/erpnext/schools/doctype/academic_year/academic_year.json b/erpnext/education/doctype/academic_year/academic_year.json similarity index 97% rename from erpnext/schools/doctype/academic_year/academic_year.json rename to erpnext/education/doctype/academic_year/academic_year.json index 3d8c4f849a2..5df89a7682d 100644 --- a/erpnext/schools/doctype/academic_year/academic_year.json +++ b/erpnext/education/doctype/academic_year/academic_year.json @@ -113,9 +113,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:46.121105", + "modified": "2017-11-10 19:06:08.123090", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Academic Year", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/academic_year/academic_year.py b/erpnext/education/doctype/academic_year/academic_year.py similarity index 100% rename from erpnext/schools/doctype/academic_year/academic_year.py rename to erpnext/education/doctype/academic_year/academic_year.py diff --git a/erpnext/schools/doctype/academic_year/test_academic_year.js b/erpnext/education/doctype/academic_year/test_academic_year.js similarity index 88% rename from erpnext/schools/doctype/academic_year/test_academic_year.js rename to erpnext/education/doctype/academic_year/test_academic_year.js index 7bf17729710..ec2f49c5a1b 100644 --- a/erpnext/schools/doctype/academic_year/test_academic_year.js +++ b/erpnext/education/doctype/academic_year/test_academic_year.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in Education +QUnit.module('education'); QUnit.test('Test: Academic Year', function(assert){ assert.expect(3); diff --git a/erpnext/schools/doctype/academic_year/test_academic_year.py b/erpnext/education/doctype/academic_year/test_academic_year.py similarity index 100% rename from erpnext/schools/doctype/academic_year/test_academic_year.py rename to erpnext/education/doctype/academic_year/test_academic_year.py diff --git a/erpnext/schools/doctype/academic_year/test_records.json b/erpnext/education/doctype/academic_year/test_records.json similarity index 100% rename from erpnext/schools/doctype/academic_year/test_records.json rename to erpnext/education/doctype/academic_year/test_records.json diff --git a/erpnext/schools/doctype/assessment_criteria/__init__.py b/erpnext/education/doctype/assessment_criteria/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_criteria/__init__.py rename to erpnext/education/doctype/assessment_criteria/__init__.py diff --git a/erpnext/schools/doctype/assessment_criteria/assessment_criteria.js b/erpnext/education/doctype/assessment_criteria/assessment_criteria.js similarity index 100% rename from erpnext/schools/doctype/assessment_criteria/assessment_criteria.js rename to erpnext/education/doctype/assessment_criteria/assessment_criteria.js diff --git a/erpnext/schools/doctype/assessment_criteria/assessment_criteria.json b/erpnext/education/doctype/assessment_criteria/assessment_criteria.json similarity index 97% rename from erpnext/schools/doctype/assessment_criteria/assessment_criteria.json rename to erpnext/education/doctype/assessment_criteria/assessment_criteria.json index 2bbd2ef7cb1..9e228fd3682 100644 --- a/erpnext/schools/doctype/assessment_criteria/assessment_criteria.json +++ b/erpnext/education/doctype/assessment_criteria/assessment_criteria.json @@ -85,9 +85,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:46.211641", + "modified": "2017-11-10 19:08:11.311304", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Criteria", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_criteria/assessment_criteria.py b/erpnext/education/doctype/assessment_criteria/assessment_criteria.py similarity index 100% rename from erpnext/schools/doctype/assessment_criteria/assessment_criteria.py rename to erpnext/education/doctype/assessment_criteria/assessment_criteria.py diff --git a/erpnext/schools/doctype/assessment_criteria/test_assessment_criteria.js b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js similarity index 83% rename from erpnext/schools/doctype/assessment_criteria/test_assessment_criteria.js rename to erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js index 6c0540eebb7..db4a4cf5a8d 100644 --- a/erpnext/schools/doctype/assessment_criteria/test_assessment_criteria.js +++ b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js @@ -1,5 +1,5 @@ -// School Assessment module -QUnit.module('schools'); +// Education Assessment module +QUnit.module('education'); QUnit.test('Test: Assessment Criteria', function(assert){ assert.expect(0); diff --git a/erpnext/schools/doctype/assessment_criteria/test_assessment_criteria.py b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py similarity index 100% rename from erpnext/schools/doctype/assessment_criteria/test_assessment_criteria.py rename to erpnext/education/doctype/assessment_criteria/test_assessment_criteria.py diff --git a/erpnext/schools/doctype/assessment_criteria/test_records.json b/erpnext/education/doctype/assessment_criteria/test_records.json similarity index 100% rename from erpnext/schools/doctype/assessment_criteria/test_records.json rename to erpnext/education/doctype/assessment_criteria/test_records.json diff --git a/erpnext/schools/doctype/assessment_criteria_group/__init__.py b/erpnext/education/doctype/assessment_criteria_group/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_criteria_group/__init__.py rename to erpnext/education/doctype/assessment_criteria_group/__init__.py diff --git a/erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.js b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.js similarity index 100% rename from erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.js rename to erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.js diff --git a/erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.json b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.json similarity index 96% rename from erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.json rename to erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.json index 7aa417f6cdc..5765b4b3f7f 100644 --- a/erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.json +++ b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.json @@ -54,9 +54,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:46.323964", + "modified": "2017-11-10 19:11:45.334917", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Criteria Group", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.py b/erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.py similarity index 100% rename from erpnext/schools/doctype/assessment_criteria_group/assessment_criteria_group.py rename to erpnext/education/doctype/assessment_criteria_group/assessment_criteria_group.py diff --git a/erpnext/schools/doctype/assessment_criteria_group/test_assessment_criteria_group.js b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js similarity index 82% rename from erpnext/schools/doctype/assessment_criteria_group/test_assessment_criteria_group.js rename to erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js index 92dba1dfd86..bcfcaf82e63 100644 --- a/erpnext/schools/doctype/assessment_criteria_group/test_assessment_criteria_group.js +++ b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js @@ -1,5 +1,5 @@ -// School Assessment module -QUnit.module('schools'); +// Education Assessment module +QUnit.module('education'); QUnit.test('Test: Assessment Criteria Group', function(assert){ assert.expect(0); diff --git a/erpnext/schools/doctype/assessment_criteria_group/test_assessment_criteria_group.py b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py similarity index 100% rename from erpnext/schools/doctype/assessment_criteria_group/test_assessment_criteria_group.py rename to erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py diff --git a/erpnext/schools/doctype/assessment_group/__init__.py b/erpnext/education/doctype/assessment_group/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_group/__init__.py rename to erpnext/education/doctype/assessment_group/__init__.py diff --git a/erpnext/schools/doctype/assessment_group/assessment_group.js b/erpnext/education/doctype/assessment_group/assessment_group.js similarity index 100% rename from erpnext/schools/doctype/assessment_group/assessment_group.js rename to erpnext/education/doctype/assessment_group/assessment_group.js diff --git a/erpnext/schools/doctype/assessment_group/assessment_group.json b/erpnext/education/doctype/assessment_group/assessment_group.json similarity index 98% rename from erpnext/schools/doctype/assessment_group/assessment_group.json rename to erpnext/education/doctype/assessment_group/assessment_group.json index 8c93bb2ec50..56917d20526 100644 --- a/erpnext/schools/doctype/assessment_group/assessment_group.json +++ b/erpnext/education/doctype/assessment_group/assessment_group.json @@ -234,9 +234,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-21 02:12:33.177318", + "modified": "2017-11-10 19:09:25.366400", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Group", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_group/assessment_group.py b/erpnext/education/doctype/assessment_group/assessment_group.py similarity index 100% rename from erpnext/schools/doctype/assessment_group/assessment_group.py rename to erpnext/education/doctype/assessment_group/assessment_group.py diff --git a/erpnext/schools/doctype/assessment_group/assessment_group_tree.js b/erpnext/education/doctype/assessment_group/assessment_group_tree.js similarity index 100% rename from erpnext/schools/doctype/assessment_group/assessment_group_tree.js rename to erpnext/education/doctype/assessment_group/assessment_group_tree.js diff --git a/erpnext/schools/doctype/assessment_group/test_assessment_group.js b/erpnext/education/doctype/assessment_group/test_assessment_group.js similarity index 98% rename from erpnext/schools/doctype/assessment_group/test_assessment_group.js rename to erpnext/education/doctype/assessment_group/test_assessment_group.js index aa6da47d221..93026d2ea54 100644 --- a/erpnext/schools/doctype/assessment_group/test_assessment_group.js +++ b/erpnext/education/doctype/assessment_group/test_assessment_group.js @@ -1,5 +1,5 @@ -// School Assessment module -QUnit.module('schools'); +// Education Assessment module +QUnit.module('education'); QUnit.test('Test: Assessment Group', function(assert){ assert.expect(4); diff --git a/erpnext/schools/doctype/assessment_group/test_assessment_group.py b/erpnext/education/doctype/assessment_group/test_assessment_group.py similarity index 100% rename from erpnext/schools/doctype/assessment_group/test_assessment_group.py rename to erpnext/education/doctype/assessment_group/test_assessment_group.py diff --git a/erpnext/schools/doctype/assessment_plan/__init__.py b/erpnext/education/doctype/assessment_plan/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_plan/__init__.py rename to erpnext/education/doctype/assessment_plan/__init__.py diff --git a/erpnext/schools/doctype/assessment_plan/assessment_plan.js b/erpnext/education/doctype/assessment_plan/assessment_plan.js similarity index 96% rename from erpnext/schools/doctype/assessment_plan/assessment_plan.js rename to erpnext/education/doctype/assessment_plan/assessment_plan.js index e83c4d3c70e..f6fceb15636 100644 --- a/erpnext/schools/doctype/assessment_plan/assessment_plan.js +++ b/erpnext/education/doctype/assessment_plan/assessment_plan.js @@ -40,7 +40,7 @@ frappe.ui.form.on("Assessment Plan", { course: function(frm) { if (frm.doc.course && frm.doc.maximum_assessment_score) { frappe.call({ - method: "erpnext.schools.api.get_assessment_criteria", + method: "erpnext.education.api.get_assessment_criteria", args: { course: frm.doc.course }, diff --git a/erpnext/schools/doctype/assessment_plan/assessment_plan.json b/erpnext/education/doctype/assessment_plan/assessment_plan.json similarity index 99% rename from erpnext/schools/doctype/assessment_plan/assessment_plan.json rename to erpnext/education/doctype/assessment_plan/assessment_plan.json index 265612be8bf..9dbba4f99f0 100644 --- a/erpnext/schools/doctype/assessment_plan/assessment_plan.json +++ b/erpnext/education/doctype/assessment_plan/assessment_plan.json @@ -633,9 +633,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:46.535547", + "modified": "2017-11-10 19:12:10.383524", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Plan", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_plan/assessment_plan.py b/erpnext/education/doctype/assessment_plan/assessment_plan.py similarity index 97% rename from erpnext/schools/doctype/assessment_plan/assessment_plan.py rename to erpnext/education/doctype/assessment_plan/assessment_plan.py index 55c41485f04..7ad76b8731f 100644 --- a/erpnext/schools/doctype/assessment_plan/assessment_plan.py +++ b/erpnext/education/doctype/assessment_plan/assessment_plan.py @@ -16,7 +16,7 @@ class AssessmentPlan(Document): def validate_overlap(self): """Validates overlap for Student Group, Instructor, Room""" - from erpnext.schools.utils import validate_overlap_for + from erpnext.education.utils import validate_overlap_for #Validate overlapping course schedules. if self.student_group: diff --git a/erpnext/schools/doctype/assessment_plan/test_assessment_plan.js b/erpnext/education/doctype/assessment_plan/test_assessment_plan.js similarity index 96% rename from erpnext/schools/doctype/assessment_plan/test_assessment_plan.js rename to erpnext/education/doctype/assessment_plan/test_assessment_plan.js index faa39bf4e68..b0bff264e85 100644 --- a/erpnext/schools/doctype/assessment_plan/test_assessment_plan.js +++ b/erpnext/education/doctype/assessment_plan/test_assessment_plan.js @@ -1,5 +1,5 @@ -// Testing Assessment Module in Schools -QUnit.module('schools'); +// Testing Assessment Module in education +QUnit.module('education'); QUnit.test('Test: Assessment Plan', function(assert){ assert.expect(6); diff --git a/erpnext/schools/doctype/assessment_plan/test_assessment_plan.py b/erpnext/education/doctype/assessment_plan/test_assessment_plan.py similarity index 100% rename from erpnext/schools/doctype/assessment_plan/test_assessment_plan.py rename to erpnext/education/doctype/assessment_plan/test_assessment_plan.py diff --git a/erpnext/schools/doctype/assessment_plan_criteria/__init__.py b/erpnext/education/doctype/assessment_plan_criteria/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_plan_criteria/__init__.py rename to erpnext/education/doctype/assessment_plan_criteria/__init__.py diff --git a/erpnext/schools/doctype/assessment_plan_criteria/assessment_plan_criteria.json b/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.json similarity index 97% rename from erpnext/schools/doctype/assessment_plan_criteria/assessment_plan_criteria.json rename to erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.json index cf985f6a8c1..d9ad0cb952f 100644 --- a/erpnext/schools/doctype/assessment_plan_criteria/assessment_plan_criteria.json +++ b/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.json @@ -115,9 +115,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:46.732666", + "modified": "2017-11-10 19:10:50.560006", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Plan Criteria", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_plan_criteria/assessment_plan_criteria.py b/erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.py similarity index 100% rename from erpnext/schools/doctype/assessment_plan_criteria/assessment_plan_criteria.py rename to erpnext/education/doctype/assessment_plan_criteria/assessment_plan_criteria.py diff --git a/erpnext/schools/doctype/assessment_result/__init__.py b/erpnext/education/doctype/assessment_result/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_result/__init__.py rename to erpnext/education/doctype/assessment_result/__init__.py diff --git a/erpnext/schools/doctype/assessment_result/assessment_result.js b/erpnext/education/doctype/assessment_result/assessment_result.js similarity index 92% rename from erpnext/schools/doctype/assessment_result/assessment_result.js rename to erpnext/education/doctype/assessment_result/assessment_result.js index 6d2089681f4..d1115a7da67 100644 --- a/erpnext/schools/doctype/assessment_result/assessment_result.js +++ b/erpnext/education/doctype/assessment_result/assessment_result.js @@ -9,7 +9,7 @@ frappe.ui.form.on("Assessment Result", { assessment_plan: function(frm) { if (frm.doc.assessment_plan) { frappe.call({ - method: "erpnext.schools.api.get_assessment_details", + method: "erpnext.education.api.get_assessment_details", args: { assessment_plan: frm.doc.assessment_plan }, @@ -37,7 +37,7 @@ frappe.ui.form.on("Assessment Result Detail", { } else { frappe.call({ - method: "erpnext.schools.api.get_grade", + method: "erpnext.education.api.get_grade", args: { grading_scale: frm.doc.grading_scale, percentage: ((d.score/d.maximum_score) * 100) diff --git a/erpnext/schools/doctype/assessment_result/assessment_result.json b/erpnext/education/doctype/assessment_result/assessment_result.json similarity index 99% rename from erpnext/schools/doctype/assessment_result/assessment_result.json rename to erpnext/education/doctype/assessment_result/assessment_result.json index 13b927c367b..3912587f996 100644 --- a/erpnext/schools/doctype/assessment_result/assessment_result.json +++ b/erpnext/education/doctype/assessment_result/assessment_result.json @@ -474,9 +474,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-08-31 15:39:24.813328", + "modified": "2017-11-10 18:58:32.114529", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Result", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_result/assessment_result.py b/erpnext/education/doctype/assessment_result/assessment_result.py similarity index 94% rename from erpnext/schools/doctype/assessment_result/assessment_result.py rename to erpnext/education/doctype/assessment_result/assessment_result.py index 3c036dd56ff..7459d5afe7d 100644 --- a/erpnext/schools/doctype/assessment_result/assessment_result.py +++ b/erpnext/education/doctype/assessment_result/assessment_result.py @@ -7,8 +7,8 @@ import frappe from frappe import _ from frappe.utils import flt from frappe.model.document import Document -from erpnext.schools.api import get_grade -from erpnext.schools.api import get_assessment_details +from erpnext.education.api import get_grade +from erpnext.education.api import get_assessment_details from frappe.utils.csvutils import getlink diff --git a/erpnext/schools/doctype/assessment_result/test_assessment_result.js b/erpnext/education/doctype/assessment_result/test_assessment_result.js similarity index 95% rename from erpnext/schools/doctype/assessment_result/test_assessment_result.js rename to erpnext/education/doctype/assessment_result/test_assessment_result.js index 1ed249a75ba..b7adfacb1a2 100644 --- a/erpnext/schools/doctype/assessment_result/test_assessment_result.js +++ b/erpnext/education/doctype/assessment_result/test_assessment_result.js @@ -1,5 +1,5 @@ -// School Assessment module -QUnit.module('schools'); +// Education Assessment module +QUnit.module('education'); QUnit.test('Test: Assessment Result', function(assert){ assert.expect(25); @@ -46,7 +46,7 @@ QUnit.test('Test: Assessment Result', function(assert){ assert.equal(cur_frm.doc.maximum_score, assessment_plan.message.maximum_assessment_score, 'Maximum score correctly fetched'); frappe.call({ - method: "erpnext.schools.api.get_grade", + method: "erpnext.education.api.get_grade", args: { "grading_scale": assessment_plan.message.grading_scale, "percentage": cur_frm.doc.total_score diff --git a/erpnext/schools/doctype/assessment_result/test_assessment_result.py b/erpnext/education/doctype/assessment_result/test_assessment_result.py similarity index 91% rename from erpnext/schools/doctype/assessment_result/test_assessment_result.py rename to erpnext/education/doctype/assessment_result/test_assessment_result.py index 66e611c866f..bf12b3223be 100644 --- a/erpnext/schools/doctype/assessment_result/test_assessment_result.py +++ b/erpnext/education/doctype/assessment_result/test_assessment_result.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe import unittest -from erpnext.schools.api import get_grade +from erpnext.education.api import get_grade # test_records = frappe.get_test_records('Assessment Result') diff --git a/erpnext/schools/doctype/assessment_result_detail/__init__.py b/erpnext/education/doctype/assessment_result_detail/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_result_detail/__init__.py rename to erpnext/education/doctype/assessment_result_detail/__init__.py diff --git a/erpnext/schools/doctype/assessment_result_detail/assessment_result_detail.json b/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.json similarity index 98% rename from erpnext/schools/doctype/assessment_result_detail/assessment_result_detail.json rename to erpnext/education/doctype/assessment_result_detail/assessment_result_detail.json index e7076bcfd64..85d943beaa5 100644 --- a/erpnext/schools/doctype/assessment_result_detail/assessment_result_detail.json +++ b/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.json @@ -175,9 +175,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:47.068704", + "modified": "2017-11-10 19:11:14.362410", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Result Detail", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_result_detail/assessment_result_detail.py b/erpnext/education/doctype/assessment_result_detail/assessment_result_detail.py similarity index 100% rename from erpnext/schools/doctype/assessment_result_detail/assessment_result_detail.py rename to erpnext/education/doctype/assessment_result_detail/assessment_result_detail.py diff --git a/erpnext/schools/doctype/assessment_result_tool/__init__.py b/erpnext/education/doctype/assessment_result_tool/__init__.py similarity index 100% rename from erpnext/schools/doctype/assessment_result_tool/__init__.py rename to erpnext/education/doctype/assessment_result_tool/__init__.py diff --git a/erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.js b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.js similarity index 94% rename from erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.js rename to erpnext/education/doctype/assessment_result_tool/assessment_result_tool.js index 142bbf4756e..48237917d3f 100644 --- a/erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.js +++ b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.js @@ -25,7 +25,7 @@ frappe.ui.form.on('Assessment Result Tool', { if (!frm.doc.student_group) return frappe.call({ - method: "erpnext.schools.api.get_assessment_students", + method: "erpnext.education.api.get_assessment_students", args: { "assessment_plan": frm.doc.assessment_plan, "student_group": frm.doc.student_group @@ -49,7 +49,7 @@ frappe.ui.form.on('Assessment Result Tool', { $(frm.fields_dict.result_html.wrapper).empty(); let assessment_plan = frm.doc.assessment_plan; frappe.call({ - method: "erpnext.schools.api.get_assessment_details", + method: "erpnext.education.api.get_assessment_details", args: { assessment_plan: assessment_plan }, @@ -106,7 +106,7 @@ frappe.ui.form.on('Assessment Result Tool', { student_scores["comment"] = $(input).val(); }); frappe.call({ - method: "erpnext.schools.api.mark_assessment_result", + method: "erpnext.education.api.mark_assessment_result", args: { "assessment_plan": frm.doc.assessment_plan, "scores": student_scores @@ -137,7 +137,7 @@ frappe.ui.form.on('Assessment Result Tool', { if (frm.doc.show_submit) { frm.page.set_primary_action(__("Submit"), function() { frappe.call({ - method: "erpnext.schools.api.submit_assessment_results", + method: "erpnext.education.api.submit_assessment_results", args: { "assessment_plan": frm.doc.assessment_plan, "student_group": frm.doc.student_group diff --git a/erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.json b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.json similarity index 98% rename from erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.json rename to erpnext/education/doctype/assessment_result_tool/assessment_result_tool.json index 116fbad81ef..1ea50626399 100644 --- a/erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.json +++ b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.json @@ -175,9 +175,9 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-11-08 11:51:43.247815", + "modified": "2017-11-10 18:55:54.438981", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Assessment Result Tool", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.py b/erpnext/education/doctype/assessment_result_tool/assessment_result_tool.py similarity index 100% rename from erpnext/schools/doctype/assessment_result_tool/assessment_result_tool.py rename to erpnext/education/doctype/assessment_result_tool/assessment_result_tool.py diff --git a/erpnext/schools/doctype/assessment_result_tool/test_assessment_result_tool.js b/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js similarity index 93% rename from erpnext/schools/doctype/assessment_result_tool/test_assessment_result_tool.js rename to erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js index 7d9c7d31e0e..0bbe33194a3 100644 --- a/erpnext/schools/doctype/assessment_result_tool/test_assessment_result_tool.js +++ b/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js @@ -1,5 +1,5 @@ -// School Assessment module -QUnit.module('schools'); +// Education Assessment module +QUnit.module('education'); QUnit.test('Test: Assessment Result Tool', function(assert){ assert.expect(1); diff --git a/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py b/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py new file mode 100644 index 00000000000..f784ccb256b --- /dev/null +++ b/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestAssessmentResultTool(unittest.TestCase): + pass diff --git a/erpnext/schools/doctype/course/__init__.py b/erpnext/education/doctype/course/__init__.py similarity index 100% rename from erpnext/schools/doctype/course/__init__.py rename to erpnext/education/doctype/course/__init__.py diff --git a/erpnext/schools/doctype/course/course.js b/erpnext/education/doctype/course/course.js similarity index 100% rename from erpnext/schools/doctype/course/course.js rename to erpnext/education/doctype/course/course.js diff --git a/erpnext/schools/doctype/course/course.json b/erpnext/education/doctype/course/course.json similarity index 99% rename from erpnext/schools/doctype/course/course.json rename to erpnext/education/doctype/course/course.json index d2f17224ea8..15360f8d582 100644 --- a/erpnext/schools/doctype/course/course.json +++ b/erpnext/education/doctype/course/course.json @@ -356,9 +356,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:47.260549", + "modified": "2017-11-10 19:06:28.909585", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Course", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/course/course.py b/erpnext/education/doctype/course/course.py similarity index 100% rename from erpnext/schools/doctype/course/course.py rename to erpnext/education/doctype/course/course.py diff --git a/erpnext/schools/doctype/course/test_course.js b/erpnext/education/doctype/course/test_course.js similarity index 94% rename from erpnext/schools/doctype/course/test_course.js rename to erpnext/education/doctype/course/test_course.js index 48667309cea..88fddc2bb6d 100644 --- a/erpnext/schools/doctype/course/test_course.js +++ b/erpnext/education/doctype/course/test_course.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in education +QUnit.module('education'); QUnit.test('test course', function(assert) { assert.expect(8); diff --git a/erpnext/schools/doctype/course/test_course.py b/erpnext/education/doctype/course/test_course.py similarity index 100% rename from erpnext/schools/doctype/course/test_course.py rename to erpnext/education/doctype/course/test_course.py diff --git a/erpnext/schools/doctype/course/test_records.json b/erpnext/education/doctype/course/test_records.json similarity index 100% rename from erpnext/schools/doctype/course/test_records.json rename to erpnext/education/doctype/course/test_records.json diff --git a/erpnext/schools/doctype/course_assessment_criteria/__init__.py b/erpnext/education/doctype/course_assessment_criteria/__init__.py similarity index 100% rename from erpnext/schools/doctype/course_assessment_criteria/__init__.py rename to erpnext/education/doctype/course_assessment_criteria/__init__.py diff --git a/erpnext/schools/doctype/course_assessment_criteria/course_assessment_criteria.json b/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.json similarity index 97% rename from erpnext/schools/doctype/course_assessment_criteria/course_assessment_criteria.json rename to erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.json index 73d04877a7c..2d8c0b3441e 100644 --- a/erpnext/schools/doctype/course_assessment_criteria/course_assessment_criteria.json +++ b/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.json @@ -115,9 +115,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:47.420656", + "modified": "2017-11-10 19:10:44.710837", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Course Assessment Criteria", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/course_assessment_criteria/course_assessment_criteria.py b/erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.py similarity index 100% rename from erpnext/schools/doctype/course_assessment_criteria/course_assessment_criteria.py rename to erpnext/education/doctype/course_assessment_criteria/course_assessment_criteria.py diff --git a/erpnext/schools/doctype/course_schedule/__init__.py b/erpnext/education/doctype/course_schedule/__init__.py similarity index 100% rename from erpnext/schools/doctype/course_schedule/__init__.py rename to erpnext/education/doctype/course_schedule/__init__.py diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.js b/erpnext/education/doctype/course_schedule/course_schedule.js similarity index 92% rename from erpnext/schools/doctype/course_schedule/course_schedule.js rename to erpnext/education/doctype/course_schedule/course_schedule.js index 7778a6e6157..692c2a83892 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.js +++ b/erpnext/education/doctype/course_schedule/course_schedule.js @@ -1,4 +1,4 @@ -frappe.provide("schools") +frappe.provide("education"); cur_frm.add_fetch("student_group", "course", "course") frappe.ui.form.on("Course Schedule", { diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.json b/erpnext/education/doctype/course_schedule/course_schedule.json similarity index 99% rename from erpnext/schools/doctype/course_schedule/course_schedule.json rename to erpnext/education/doctype/course_schedule/course_schedule.json index 68ef2334f3e..9049a80bd9d 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.json +++ b/erpnext/education/doctype/course_schedule/course_schedule.json @@ -420,9 +420,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:47.516781", + "modified": "2017-11-10 19:10:28.797143", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Course Schedule", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.py b/erpnext/education/doctype/course_schedule/course_schedule.py similarity index 96% rename from erpnext/schools/doctype/course_schedule/course_schedule.py rename to erpnext/education/doctype/course_schedule/course_schedule.py index 845f5f5f92c..5083ff6589d 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.py +++ b/erpnext/education/doctype/course_schedule/course_schedule.py @@ -32,7 +32,7 @@ class CourseSchedule(Document): def validate_overlap(self): """Validates overlap for Student Group, Instructor, Room""" - from erpnext.schools.utils import validate_overlap_for + from erpnext.education.utils import validate_overlap_for #Validate overlapping course schedules. if self.student_group: diff --git a/erpnext/schools/doctype/course_schedule/course_schedule_calendar.js b/erpnext/education/doctype/course_schedule/course_schedule_calendar.js similarity index 91% rename from erpnext/schools/doctype/course_schedule/course_schedule_calendar.js rename to erpnext/education/doctype/course_schedule/course_schedule_calendar.js index 94ce7208949..c11405de2ba 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule_calendar.js +++ b/erpnext/education/doctype/course_schedule/course_schedule_calendar.js @@ -34,5 +34,5 @@ frappe.views.calendar["Course Schedule"] = { "label": __("Room") } ], - get_events_method: "erpnext.schools.api.get_course_schedule_events" + get_events_method: "erpnext.education.api.get_course_schedule_events" } diff --git a/erpnext/education/doctype/course_schedule/test_course_schedule.js b/erpnext/education/doctype/course_schedule/test_course_schedule.js new file mode 100644 index 00000000000..5cdb67be482 --- /dev/null +++ b/erpnext/education/doctype/course_schedule/test_course_schedule.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Course Schedule", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Course Schedule + () => frappe.tests.make('Course Schedule', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/schools/doctype/course_schedule/test_course_schedule.py b/erpnext/education/doctype/course_schedule/test_course_schedule.py similarity index 98% rename from erpnext/schools/doctype/course_schedule/test_course_schedule.py rename to erpnext/education/doctype/course_schedule/test_course_schedule.py index f1313820a5f..9ba6bd3e4b1 100644 --- a/erpnext/schools/doctype/course_schedule/test_course_schedule.py +++ b/erpnext/education/doctype/course_schedule/test_course_schedule.py @@ -8,7 +8,7 @@ import unittest import datetime from frappe.utils import today, to_timedelta -from erpnext.schools.utils import OverlapError +from erpnext.education.utils import OverlapError # test_records = frappe.get_test_records('Course Schedule') diff --git a/erpnext/schools/doctype/course_scheduling_tool/__init__.py b/erpnext/education/doctype/course_scheduling_tool/__init__.py similarity index 100% rename from erpnext/schools/doctype/course_scheduling_tool/__init__.py rename to erpnext/education/doctype/course_scheduling_tool/__init__.py diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.js similarity index 100% rename from erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js rename to erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.js diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.json similarity index 99% rename from erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json rename to erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.json index 9bb99d75a13..11932fe9cf8 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.json +++ b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.json @@ -604,7 +604,7 @@ "menu_index": 0, "modified": "2017-11-21 16:47:58.091740", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Course Scheduling Tool", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py similarity index 98% rename from erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py rename to erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py index 647d34b65e2..97c29ab667d 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.py +++ b/erpnext/education/doctype/course_scheduling_tool/course_scheduling_tool.py @@ -8,7 +8,7 @@ import calendar from frappe import _ from frappe.model.document import Document from frappe.utils import add_days, getdate -from erpnext.schools.utils import OverlapError +from erpnext.education.utils import OverlapError class CourseSchedulingTool(Document): diff --git a/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.js b/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.js new file mode 100644 index 00000000000..4419d181167 --- /dev/null +++ b/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Course Scheduling Tool", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Course Scheduling Tool + () => frappe.tests.make('Course Scheduling Tool', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py b/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py new file mode 100644 index 00000000000..d921f8e0e15 --- /dev/null +++ b/erpnext/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestCourseSchedulingTool(unittest.TestCase): + pass diff --git a/erpnext/schools/doctype/fee_category/__init__.py b/erpnext/education/doctype/education_settings/__init__.py similarity index 100% rename from erpnext/schools/doctype/fee_category/__init__.py rename to erpnext/education/doctype/education_settings/__init__.py diff --git a/erpnext/schools/doctype/school_settings/school_settings.js b/erpnext/education/doctype/education_settings/education_settings.js similarity index 78% rename from erpnext/schools/doctype/school_settings/school_settings.js rename to erpnext/education/doctype/education_settings/education_settings.js index 2707c428768..764d8b4a7f4 100644 --- a/erpnext/schools/doctype/school_settings/school_settings.js +++ b/erpnext/education/doctype/education_settings/education_settings.js @@ -1,7 +1,7 @@ // Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -frappe.ui.form.on('School Settings', { +frappe.ui.form.on('Education Settings', { refresh: function(frm) { } diff --git a/erpnext/schools/doctype/school_settings/school_settings.json b/erpnext/education/doctype/education_settings/education_settings.json similarity index 98% rename from erpnext/schools/doctype/school_settings/school_settings.json rename to erpnext/education/doctype/education_settings/education_settings.json index b6d9890ebd2..2771ad69c30 100644 --- a/erpnext/schools/doctype/school_settings/school_settings.json +++ b/erpnext/education/doctype/education_settings/education_settings.json @@ -267,10 +267,10 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-08-25 02:36:48.744456", + "modified": "2017-11-16 13:23:06.124735", "modified_by": "Administrator", - "module": "Schools", - "name": "School Settings", + "module": "Education", + "name": "Education Settings", "name_case": "", "owner": "Administrator", "permissions": [ diff --git a/erpnext/schools/doctype/school_settings/school_settings.py b/erpnext/education/doctype/education_settings/education_settings.py similarity index 85% rename from erpnext/schools/doctype/school_settings/school_settings.py rename to erpnext/education/doctype/education_settings/education_settings.py index 88235cfc349..9286efa7c49 100644 --- a/erpnext/schools/doctype/school_settings/school_settings.py +++ b/erpnext/education/doctype/education_settings/education_settings.py @@ -7,7 +7,7 @@ import frappe import frappe.defaults from frappe.model.document import Document -school_keydict = { +education_keydict = { # "key in defaults": "key in Global Defaults" "academic_year": "current_academic_year", "academic_term": "current_academic_term", @@ -15,11 +15,12 @@ school_keydict = { "validate_course": "validate_course" } -class SchoolSettings(Document): + +class EducationSettings(Document): def on_update(self): """update defaults""" - for key in school_keydict: - frappe.db.set_default(key, self.get(school_keydict[key], '')) + for key in education_keydict: + frappe.db.set_default(key, self.get(education_keydict[key], '')) # clear cache frappe.clear_cache() diff --git a/erpnext/schools/doctype/school_settings/test_school_settings.js b/erpnext/education/doctype/education_settings/test_education_settings.js similarity index 64% rename from erpnext/schools/doctype/school_settings/test_school_settings.js rename to erpnext/education/doctype/education_settings/test_education_settings.js index 641405684c1..990b0aa2a46 100644 --- a/erpnext/schools/doctype/school_settings/test_school_settings.js +++ b/erpnext/education/doctype/education_settings/test_education_settings.js @@ -1,11 +1,17 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line -QUnit.test("Test: School Settings", function(assert){ - assert.expect(3); +// Testing Setup Module in Education +QUnit.module('education'); + +QUnit.test("test: Education Settings", function (assert) { let done = assert.async(); + + assert.expect(3); + frappe.run_serially([ - () => frappe.set_route("List", "School Settings"), + () => frappe.set_route("List", "Education Settings"), () => frappe.timeout(0.4), () => { return frappe.tests.set_form_values(cur_frm, [ @@ -22,4 +28,4 @@ QUnit.test("Test: School Settings", function(assert){ }, () => done() ]); -}); \ No newline at end of file +}); diff --git a/erpnext/education/doctype/education_settings/test_education_settings.py b/erpnext/education/doctype/education_settings/test_education_settings.py new file mode 100644 index 00000000000..038fb6e57e1 --- /dev/null +++ b/erpnext/education/doctype/education_settings/test_education_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestEducationSettings(unittest.TestCase): + pass diff --git a/erpnext/schools/doctype/fee_component/__init__.py b/erpnext/education/doctype/fee_category/__init__.py similarity index 100% rename from erpnext/schools/doctype/fee_component/__init__.py rename to erpnext/education/doctype/fee_category/__init__.py diff --git a/erpnext/schools/doctype/fee_category/fee_category.js b/erpnext/education/doctype/fee_category/fee_category.js similarity index 100% rename from erpnext/schools/doctype/fee_category/fee_category.js rename to erpnext/education/doctype/fee_category/fee_category.js diff --git a/erpnext/schools/doctype/fee_category/fee_category.json b/erpnext/education/doctype/fee_category/fee_category.json similarity index 98% rename from erpnext/schools/doctype/fee_category/fee_category.json rename to erpnext/education/doctype/fee_category/fee_category.json index 2b55f8d87a2..c1bfa8e8369 100644 --- a/erpnext/schools/doctype/fee_category/fee_category.json +++ b/erpnext/education/doctype/fee_category/fee_category.json @@ -90,9 +90,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-02 17:57:18.069158", + "modified": "2017-11-10 18:56:33.824534", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fee Category", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fee_category/fee_category.py b/erpnext/education/doctype/fee_category/fee_category.py similarity index 100% rename from erpnext/schools/doctype/fee_category/fee_category.py rename to erpnext/education/doctype/fee_category/fee_category.py diff --git a/erpnext/education/doctype/fee_category/test_fee_category.js b/erpnext/education/doctype/fee_category/test_fee_category.js new file mode 100644 index 00000000000..a08ed33e8b6 --- /dev/null +++ b/erpnext/education/doctype/fee_category/test_fee_category.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Fee Category", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Fee Category + () => frappe.tests.make('Fee Category', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/schools/doctype/fee_category/test_fee_category.py b/erpnext/education/doctype/fee_category/test_fee_category.py similarity index 100% rename from erpnext/schools/doctype/fee_category/test_fee_category.py rename to erpnext/education/doctype/fee_category/test_fee_category.py diff --git a/erpnext/schools/doctype/fee_category/test_records.json b/erpnext/education/doctype/fee_category/test_records.json similarity index 100% rename from erpnext/schools/doctype/fee_category/test_records.json rename to erpnext/education/doctype/fee_category/test_records.json diff --git a/erpnext/schools/doctype/fee_schedule/__init__.py b/erpnext/education/doctype/fee_component/__init__.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule/__init__.py rename to erpnext/education/doctype/fee_component/__init__.py diff --git a/erpnext/schools/doctype/fee_component/fee_component.json b/erpnext/education/doctype/fee_component/fee_component.json similarity index 98% rename from erpnext/schools/doctype/fee_component/fee_component.json rename to erpnext/education/doctype/fee_component/fee_component.json index ccf1f659db6..f6e13c48b20 100644 --- a/erpnext/schools/doctype/fee_component/fee_component.json +++ b/erpnext/education/doctype/fee_component/fee_component.json @@ -150,9 +150,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-09-11 16:48:07.810959", + "modified": "2017-11-10 18:58:10.254407", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fee Component", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fee_component/fee_component.py b/erpnext/education/doctype/fee_component/fee_component.py similarity index 100% rename from erpnext/schools/doctype/fee_component/fee_component.py rename to erpnext/education/doctype/fee_component/fee_component.py diff --git a/erpnext/schools/doctype/fee_schedule_program/__init__.py b/erpnext/education/doctype/fee_schedule/__init__.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule_program/__init__.py rename to erpnext/education/doctype/fee_schedule/__init__.py diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.js b/erpnext/education/doctype/fee_schedule/fee_schedule.js similarity index 95% rename from erpnext/schools/doctype/fee_schedule/fee_schedule.js rename to erpnext/education/doctype/fee_schedule/fee_schedule.js index d834b887d94..a560ea7e32a 100644 --- a/erpnext/schools/doctype/fee_schedule/fee_schedule.js +++ b/erpnext/education/doctype/fee_schedule/fee_schedule.js @@ -78,7 +78,7 @@ frappe.ui.form.on('Fee Schedule', { fee_structure: function(frm) { if (frm.doc.fee_structure) { frappe.call({ - method: "erpnext.schools.doctype.fee_schedule.fee_schedule.get_fee_structure", + method: "erpnext.education.doctype.fee_schedule.fee_schedule.get_fee_structure", args: { "target_doc": frm.doc.name, "source_name": frm.doc.fee_structure @@ -96,7 +96,7 @@ frappe.ui.form.on("Fee Schedule Student Group", { student_group: function(frm, cdt, cdn) { var row = locals[cdt][cdn]; frappe.call({ - method: "erpnext.schools.doctype.fee_schedule.fee_schedule.get_total_students", + method: "erpnext.education.doctype.fee_schedule.fee_schedule.get_total_students", args: { "student_group": row.student_group, "academic_year": frm.doc.academic_year, diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.json b/erpnext/education/doctype/fee_schedule/fee_schedule.json similarity index 99% rename from erpnext/schools/doctype/fee_schedule/fee_schedule.json rename to erpnext/education/doctype/fee_schedule/fee_schedule.json index ab609112a1f..a1ea9bd4cd2 100644 --- a/erpnext/schools/doctype/fee_schedule/fee_schedule.json +++ b/erpnext/education/doctype/fee_schedule/fee_schedule.json @@ -1029,9 +1029,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-11-02 17:55:22.851581", + "modified": "2017-11-10 18:56:46.330631", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fee Schedule", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule.py b/erpnext/education/doctype/fee_schedule/fee_schedule.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule/fee_schedule.py rename to erpnext/education/doctype/fee_schedule/fee_schedule.py diff --git a/erpnext/schools/doctype/fee_schedule/fee_schedule_list.js b/erpnext/education/doctype/fee_schedule/fee_schedule_list.js similarity index 100% rename from erpnext/schools/doctype/fee_schedule/fee_schedule_list.js rename to erpnext/education/doctype/fee_schedule/fee_schedule_list.js diff --git a/erpnext/schools/doctype/fee_schedule/test_fee_schedule.js b/erpnext/education/doctype/fee_schedule/test_fee_schedule.js similarity index 100% rename from erpnext/schools/doctype/fee_schedule/test_fee_schedule.js rename to erpnext/education/doctype/fee_schedule/test_fee_schedule.js diff --git a/erpnext/schools/doctype/fee_schedule/test_fee_schedule.py b/erpnext/education/doctype/fee_schedule/test_fee_schedule.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule/test_fee_schedule.py rename to erpnext/education/doctype/fee_schedule/test_fee_schedule.py diff --git a/erpnext/schools/doctype/fee_schedule_student_group/__init__.py b/erpnext/education/doctype/fee_schedule_program/__init__.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule_student_group/__init__.py rename to erpnext/education/doctype/fee_schedule_program/__init__.py diff --git a/erpnext/schools/doctype/fee_schedule_program/fee_schedule_program.json b/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.json similarity index 97% rename from erpnext/schools/doctype/fee_schedule_program/fee_schedule_program.json rename to erpnext/education/doctype/fee_schedule_program/fee_schedule_program.json index 42cc7bfcd89..e9a5c12f7f2 100644 --- a/erpnext/schools/doctype/fee_schedule_program/fee_schedule_program.json +++ b/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.json @@ -115,9 +115,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-08-22 16:24:40.547517", + "modified": "2017-11-10 19:09:02.326827", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fee Schedule Program", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fee_schedule_program/fee_schedule_program.py b/erpnext/education/doctype/fee_schedule_program/fee_schedule_program.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule_program/fee_schedule_program.py rename to erpnext/education/doctype/fee_schedule_program/fee_schedule_program.py diff --git a/erpnext/schools/doctype/fee_structure/__init__.py b/erpnext/education/doctype/fee_schedule_student_group/__init__.py similarity index 100% rename from erpnext/schools/doctype/fee_structure/__init__.py rename to erpnext/education/doctype/fee_schedule_student_group/__init__.py diff --git a/erpnext/schools/doctype/fee_schedule_student_group/fee_schedule_student_group.json b/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.json similarity index 96% rename from erpnext/schools/doctype/fee_schedule_student_group/fee_schedule_student_group.json rename to erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.json index c80e32087c9..aed1ae51b24 100644 --- a/erpnext/schools/doctype/fee_schedule_student_group/fee_schedule_student_group.json +++ b/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.json @@ -84,9 +84,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-08-22 16:23:12.337294", + "modified": "2017-11-10 19:09:19.498184", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fee Schedule Student Group", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fee_schedule_student_group/fee_schedule_student_group.py b/erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.py similarity index 100% rename from erpnext/schools/doctype/fee_schedule_student_group/fee_schedule_student_group.py rename to erpnext/education/doctype/fee_schedule_student_group/fee_schedule_student_group.py diff --git a/erpnext/schools/doctype/fees/__init__.py b/erpnext/education/doctype/fee_structure/__init__.py similarity index 100% rename from erpnext/schools/doctype/fees/__init__.py rename to erpnext/education/doctype/fee_structure/__init__.py diff --git a/erpnext/schools/doctype/fee_structure/fee_structure.js b/erpnext/education/doctype/fee_structure/fee_structure.js similarity index 93% rename from erpnext/schools/doctype/fee_structure/fee_structure.js rename to erpnext/education/doctype/fee_structure/fee_structure.js index 300bdc869f3..812456c2bd8 100644 --- a/erpnext/schools/doctype/fee_structure/fee_structure.js +++ b/erpnext/education/doctype/fee_structure/fee_structure.js @@ -39,7 +39,7 @@ frappe.ui.form.on('Fee Structure', { make_fee_schedule: function(frm) { frappe.model.open_mapped_doc({ - method: "erpnext.schools.doctype.fee_structure.fee_structure.make_fee_schedule", + method: "erpnext.education.doctype.fee_structure.fee_structure.make_fee_schedule", frm: frm }); } diff --git a/erpnext/schools/doctype/fee_structure/fee_structure.json b/erpnext/education/doctype/fee_structure/fee_structure.json similarity index 99% rename from erpnext/schools/doctype/fee_structure/fee_structure.json rename to erpnext/education/doctype/fee_structure/fee_structure.json index 2ae0a488bb4..428b1b19163 100644 --- a/erpnext/schools/doctype/fee_structure/fee_structure.json +++ b/erpnext/education/doctype/fee_structure/fee_structure.json @@ -577,9 +577,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-02 17:43:16.796845", + "modified": "2017-11-10 18:56:59.698192", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fee Structure", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fee_structure/fee_structure.py b/erpnext/education/doctype/fee_structure/fee_structure.py similarity index 100% rename from erpnext/schools/doctype/fee_structure/fee_structure.py rename to erpnext/education/doctype/fee_structure/fee_structure.py diff --git a/erpnext/schools/doctype/fee_structure/test_fee_structure.js b/erpnext/education/doctype/fee_structure/test_fee_structure.js similarity index 100% rename from erpnext/schools/doctype/fee_structure/test_fee_structure.js rename to erpnext/education/doctype/fee_structure/test_fee_structure.js diff --git a/erpnext/schools/doctype/fee_structure/test_fee_structure.py b/erpnext/education/doctype/fee_structure/test_fee_structure.py similarity index 100% rename from erpnext/schools/doctype/fee_structure/test_fee_structure.py rename to erpnext/education/doctype/fee_structure/test_fee_structure.py diff --git a/erpnext/schools/doctype/fee_structure/test_records.json b/erpnext/education/doctype/fee_structure/test_records.json similarity index 100% rename from erpnext/schools/doctype/fee_structure/test_records.json rename to erpnext/education/doctype/fee_structure/test_records.json diff --git a/erpnext/schools/doctype/grading_scale/__init__.py b/erpnext/education/doctype/fees/__init__.py similarity index 100% rename from erpnext/schools/doctype/grading_scale/__init__.py rename to erpnext/education/doctype/fees/__init__.py diff --git a/erpnext/schools/doctype/fees/fees.js b/erpnext/education/doctype/fees/fees.js similarity index 97% rename from erpnext/schools/doctype/fees/fees.js rename to erpnext/education/doctype/fees/fees.js index 4347308740c..2a7218a7759 100644 --- a/erpnext/schools/doctype/fees/fees.js +++ b/erpnext/education/doctype/fees/fees.js @@ -84,7 +84,7 @@ frappe.ui.form.on("Fees", { student: function(frm) { if (frm.doc.student) { frappe.call({ - method:"erpnext.schools.api.get_current_enrollment", + method:"erpnext.education.api.get_current_enrollment", args: { "student": frm.doc.student, "academic_year": frm.doc.academic_year @@ -147,7 +147,7 @@ frappe.ui.form.on("Fees", { frm.set_value("components" ,""); if (frm.doc.fee_structure) { frappe.call({ - method: "erpnext.schools.api.get_fee_components", + method: "erpnext.education.api.get_fee_components", args: { "fee_structure": frm.doc.fee_structure }, diff --git a/erpnext/schools/doctype/fees/fees.json b/erpnext/education/doctype/fees/fees.json similarity index 99% rename from erpnext/schools/doctype/fees/fees.json rename to erpnext/education/doctype/fees/fees.json index f34caf77c40..85c24719bba 100644 --- a/erpnext/schools/doctype/fees/fees.json +++ b/erpnext/education/doctype/fees/fees.json @@ -1305,9 +1305,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-02 17:31:47.155873", + "modified": "2017-11-10 18:57:12.021112", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Fees", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/fees/fees.py b/erpnext/education/doctype/fees/fees.py similarity index 100% rename from erpnext/schools/doctype/fees/fees.py rename to erpnext/education/doctype/fees/fees.py diff --git a/erpnext/schools/doctype/fees/fees_list.js b/erpnext/education/doctype/fees/fees_list.js similarity index 100% rename from erpnext/schools/doctype/fees/fees_list.js rename to erpnext/education/doctype/fees/fees_list.js diff --git a/erpnext/schools/doctype/fees/test_fees.js b/erpnext/education/doctype/fees/test_fees.js similarity index 100% rename from erpnext/schools/doctype/fees/test_fees.js rename to erpnext/education/doctype/fees/test_fees.js diff --git a/erpnext/schools/doctype/fees/test_fees.py b/erpnext/education/doctype/fees/test_fees.py similarity index 100% rename from erpnext/schools/doctype/fees/test_fees.py rename to erpnext/education/doctype/fees/test_fees.py diff --git a/erpnext/schools/doctype/grading_scale_interval/__init__.py b/erpnext/education/doctype/grading_scale/__init__.py similarity index 100% rename from erpnext/schools/doctype/grading_scale_interval/__init__.py rename to erpnext/education/doctype/grading_scale/__init__.py diff --git a/erpnext/schools/doctype/grading_scale/grading_scale.js b/erpnext/education/doctype/grading_scale/grading_scale.js similarity index 100% rename from erpnext/schools/doctype/grading_scale/grading_scale.js rename to erpnext/education/doctype/grading_scale/grading_scale.js diff --git a/erpnext/schools/doctype/grading_scale/grading_scale.json b/erpnext/education/doctype/grading_scale/grading_scale.json similarity index 98% rename from erpnext/schools/doctype/grading_scale/grading_scale.json rename to erpnext/education/doctype/grading_scale/grading_scale.json index fdaa8c6f486..67fef3e2c51 100644 --- a/erpnext/schools/doctype/grading_scale/grading_scale.json +++ b/erpnext/education/doctype/grading_scale/grading_scale.json @@ -175,9 +175,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:48.413400", + "modified": "2017-11-10 19:07:22.001040", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Grading Scale", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/grading_scale/grading_scale.py b/erpnext/education/doctype/grading_scale/grading_scale.py similarity index 100% rename from erpnext/schools/doctype/grading_scale/grading_scale.py rename to erpnext/education/doctype/grading_scale/grading_scale.py diff --git a/erpnext/schools/doctype/grading_scale/test_grading_scale.js b/erpnext/education/doctype/grading_scale/test_grading_scale.js similarity index 97% rename from erpnext/schools/doctype/grading_scale/test_grading_scale.js rename to erpnext/education/doctype/grading_scale/test_grading_scale.js index c6869245be0..e363545ff8d 100644 --- a/erpnext/schools/doctype/grading_scale/test_grading_scale.js +++ b/erpnext/education/doctype/grading_scale/test_grading_scale.js @@ -1,5 +1,5 @@ -// School Assessment module -QUnit.module('schools'); +// Education Assessment module +QUnit.module('education'); QUnit.test('Test: Grading Scale', function(assert){ assert.expect(3); diff --git a/erpnext/schools/doctype/grading_scale/test_grading_scale.py b/erpnext/education/doctype/grading_scale/test_grading_scale.py similarity index 100% rename from erpnext/schools/doctype/grading_scale/test_grading_scale.py rename to erpnext/education/doctype/grading_scale/test_grading_scale.py diff --git a/erpnext/schools/doctype/grading_scale/test_records.json b/erpnext/education/doctype/grading_scale/test_records.json similarity index 100% rename from erpnext/schools/doctype/grading_scale/test_records.json rename to erpnext/education/doctype/grading_scale/test_records.json diff --git a/erpnext/schools/doctype/guardian/__init__.py b/erpnext/education/doctype/grading_scale_interval/__init__.py similarity index 100% rename from erpnext/schools/doctype/guardian/__init__.py rename to erpnext/education/doctype/grading_scale_interval/__init__.py diff --git a/erpnext/schools/doctype/grading_scale_interval/grading_scale_interval.json b/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.json similarity index 97% rename from erpnext/schools/doctype/grading_scale_interval/grading_scale_interval.json rename to erpnext/education/doctype/grading_scale_interval/grading_scale_interval.json index cee83e3fcf5..5574e1da549 100644 --- a/erpnext/schools/doctype/grading_scale_interval/grading_scale_interval.json +++ b/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.json @@ -114,9 +114,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:48.532524", + "modified": "2017-11-10 19:08:48.083084", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Grading Scale Interval", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/grading_scale_interval/grading_scale_interval.py b/erpnext/education/doctype/grading_scale_interval/grading_scale_interval.py similarity index 100% rename from erpnext/schools/doctype/grading_scale_interval/grading_scale_interval.py rename to erpnext/education/doctype/grading_scale_interval/grading_scale_interval.py diff --git a/erpnext/schools/doctype/guardian_interest/__init__.py b/erpnext/education/doctype/guardian/__init__.py similarity index 100% rename from erpnext/schools/doctype/guardian_interest/__init__.py rename to erpnext/education/doctype/guardian/__init__.py diff --git a/erpnext/schools/doctype/guardian/guardian.js b/erpnext/education/doctype/guardian/guardian.js similarity index 100% rename from erpnext/schools/doctype/guardian/guardian.js rename to erpnext/education/doctype/guardian/guardian.js diff --git a/erpnext/schools/doctype/guardian/guardian.json b/erpnext/education/doctype/guardian/guardian.json similarity index 99% rename from erpnext/schools/doctype/guardian/guardian.json rename to erpnext/education/doctype/guardian/guardian.json index bc4cf4f64f5..500b747eb93 100644 --- a/erpnext/schools/doctype/guardian/guardian.json +++ b/erpnext/education/doctype/guardian/guardian.json @@ -476,9 +476,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:48.630678", + "modified": "2017-11-10 19:06:57.122193", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Guardian", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/guardian/guardian.py b/erpnext/education/doctype/guardian/guardian.py similarity index 100% rename from erpnext/schools/doctype/guardian/guardian.py rename to erpnext/education/doctype/guardian/guardian.py diff --git a/erpnext/schools/doctype/guardian/test_guardian.js b/erpnext/education/doctype/guardian/test_guardian.js similarity index 93% rename from erpnext/schools/doctype/guardian/test_guardian.js rename to erpnext/education/doctype/guardian/test_guardian.js index a16ba0836dc..9bbfacd5802 100644 --- a/erpnext/schools/doctype/guardian/test_guardian.js +++ b/erpnext/education/doctype/guardian/test_guardian.js @@ -1,5 +1,5 @@ -// Testing Student Module in Schools -QUnit.module('schools'); +// Testing Student Module in education +QUnit.module('education'); QUnit.test('Test: Guardian', function(assert){ assert.expect(9); diff --git a/erpnext/schools/doctype/guardian/test_guardian.py b/erpnext/education/doctype/guardian/test_guardian.py similarity index 100% rename from erpnext/schools/doctype/guardian/test_guardian.py rename to erpnext/education/doctype/guardian/test_guardian.py diff --git a/erpnext/schools/doctype/guardian_student/__init__.py b/erpnext/education/doctype/guardian_interest/__init__.py similarity index 100% rename from erpnext/schools/doctype/guardian_student/__init__.py rename to erpnext/education/doctype/guardian_interest/__init__.py diff --git a/erpnext/schools/doctype/guardian_interest/guardian_interest.json b/erpnext/education/doctype/guardian_interest/guardian_interest.json similarity index 95% rename from erpnext/schools/doctype/guardian_interest/guardian_interest.json rename to erpnext/education/doctype/guardian_interest/guardian_interest.json index aae2c557588..1995c551dba 100644 --- a/erpnext/schools/doctype/guardian_interest/guardian_interest.json +++ b/erpnext/education/doctype/guardian_interest/guardian_interest.json @@ -53,9 +53,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:48.827806", + "modified": "2017-11-10 19:10:22.333454", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Guardian Interest", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/guardian_interest/guardian_interest.py b/erpnext/education/doctype/guardian_interest/guardian_interest.py similarity index 100% rename from erpnext/schools/doctype/guardian_interest/guardian_interest.py rename to erpnext/education/doctype/guardian_interest/guardian_interest.py diff --git a/erpnext/schools/doctype/instructor/__init__.py b/erpnext/education/doctype/guardian_student/__init__.py similarity index 100% rename from erpnext/schools/doctype/instructor/__init__.py rename to erpnext/education/doctype/guardian_student/__init__.py diff --git a/erpnext/schools/doctype/guardian_student/guardian_student.json b/erpnext/education/doctype/guardian_student/guardian_student.json similarity index 97% rename from erpnext/schools/doctype/guardian_student/guardian_student.json rename to erpnext/education/doctype/guardian_student/guardian_student.json index 4242c9de857..2519a54af8b 100644 --- a/erpnext/schools/doctype/guardian_student/guardian_student.json +++ b/erpnext/education/doctype/guardian_student/guardian_student.json @@ -113,9 +113,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:48.957516", + "modified": "2017-11-10 19:10:15.786362", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Guardian Student", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/guardian_student/guardian_student.py b/erpnext/education/doctype/guardian_student/guardian_student.py similarity index 100% rename from erpnext/schools/doctype/guardian_student/guardian_student.py rename to erpnext/education/doctype/guardian_student/guardian_student.py diff --git a/erpnext/schools/doctype/program/__init__.py b/erpnext/education/doctype/instructor/__init__.py similarity index 100% rename from erpnext/schools/doctype/program/__init__.py rename to erpnext/education/doctype/instructor/__init__.py diff --git a/erpnext/schools/doctype/instructor/instructor.js b/erpnext/education/doctype/instructor/instructor.js similarity index 100% rename from erpnext/schools/doctype/instructor/instructor.js rename to erpnext/education/doctype/instructor/instructor.js diff --git a/erpnext/schools/doctype/instructor/instructor.json b/erpnext/education/doctype/instructor/instructor.json similarity index 98% rename from erpnext/schools/doctype/instructor/instructor.json rename to erpnext/education/doctype/instructor/instructor.json index cd0b4f10f80..865e07ce216 100644 --- a/erpnext/schools/doctype/instructor/instructor.json +++ b/erpnext/education/doctype/instructor/instructor.json @@ -208,9 +208,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-25 01:03:14.602994", + "modified": "2017-11-10 19:00:20.354954", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Instructor", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/instructor/instructor.py b/erpnext/education/doctype/instructor/instructor.py similarity index 79% rename from erpnext/schools/doctype/instructor/instructor.py rename to erpnext/education/doctype/instructor/instructor.py index ba179f76aa4..44a4e4c5c58 100644 --- a/erpnext/schools/doctype/instructor/instructor.py +++ b/erpnext/education/doctype/instructor/instructor.py @@ -10,9 +10,9 @@ from frappe.model.naming import make_autoname class Instructor(Document): def autoname(self): - naming_method = frappe.db.get_value("School Settings", None, "instructor_created_by") + naming_method = frappe.db.get_value("Education Settings", None, "instructor_created_by") if not naming_method: - frappe.throw(_("Please setup Instructor Naming System in School > School Settings")) + frappe.throw(_("Please setup Instructor Naming System in Education > Education Settings")) else: if naming_method == 'Naming Series': self.name = make_autoname(self.naming_series + '.####') diff --git a/erpnext/schools/doctype/instructor/test_instructor.js b/erpnext/education/doctype/instructor/test_instructor.js similarity index 86% rename from erpnext/schools/doctype/instructor/test_instructor.js rename to erpnext/education/doctype/instructor/test_instructor.js index a9e25616c19..c584f45ccaa 100644 --- a/erpnext/schools/doctype/instructor/test_instructor.js +++ b/erpnext/education/doctype/instructor/test_instructor.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in education +QUnit.module('education'); QUnit.test('Test: Instructor', function(assert){ assert.expect(2); diff --git a/erpnext/schools/doctype/instructor/test_instructor.py b/erpnext/education/doctype/instructor/test_instructor.py similarity index 100% rename from erpnext/schools/doctype/instructor/test_instructor.py rename to erpnext/education/doctype/instructor/test_instructor.py diff --git a/erpnext/schools/doctype/instructor/test_records.json b/erpnext/education/doctype/instructor/test_records.json similarity index 100% rename from erpnext/schools/doctype/instructor/test_records.json rename to erpnext/education/doctype/instructor/test_records.json diff --git a/erpnext/schools/doctype/program_course/__init__.py b/erpnext/education/doctype/program/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_course/__init__.py rename to erpnext/education/doctype/program/__init__.py diff --git a/erpnext/schools/doctype/program/program.js b/erpnext/education/doctype/program/program.js similarity index 100% rename from erpnext/schools/doctype/program/program.js rename to erpnext/education/doctype/program/program.js diff --git a/erpnext/schools/doctype/program/program.json b/erpnext/education/doctype/program/program.json similarity index 98% rename from erpnext/schools/doctype/program/program.json rename to erpnext/education/doctype/program/program.json index 46581a16ca5..05e35a2a539 100644 --- a/erpnext/schools/doctype/program/program.json +++ b/erpnext/education/doctype/program/program.json @@ -236,9 +236,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-11-02 18:08:20.823972", + "modified": "2017-11-10 18:56:18.413911", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program/program.py b/erpnext/education/doctype/program/program.py similarity index 100% rename from erpnext/schools/doctype/program/program.py rename to erpnext/education/doctype/program/program.py diff --git a/erpnext/schools/doctype/program/test_program.js b/erpnext/education/doctype/program/test_program.js similarity index 92% rename from erpnext/schools/doctype/program/test_program.js rename to erpnext/education/doctype/program/test_program.js index a14fe978eb6..dc347cf1b06 100644 --- a/erpnext/schools/doctype/program/test_program.js +++ b/erpnext/education/doctype/program/test_program.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in education +QUnit.module('education'); QUnit.test('Test: Program', function(assert){ assert.expect(6); diff --git a/erpnext/schools/doctype/program/test_program.py b/erpnext/education/doctype/program/test_program.py similarity index 100% rename from erpnext/schools/doctype/program/test_program.py rename to erpnext/education/doctype/program/test_program.py diff --git a/erpnext/schools/doctype/program/test_records.json b/erpnext/education/doctype/program/test_records.json similarity index 100% rename from erpnext/schools/doctype/program/test_records.json rename to erpnext/education/doctype/program/test_records.json diff --git a/erpnext/schools/doctype/program_enrollment/__init__.py b/erpnext/education/doctype/program_course/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment/__init__.py rename to erpnext/education/doctype/program_course/__init__.py diff --git a/erpnext/schools/doctype/program_course/program_course.json b/erpnext/education/doctype/program_course/program_course.json similarity index 98% rename from erpnext/schools/doctype/program_course/program_course.json rename to erpnext/education/doctype/program_course/program_course.json index 4922a95bf49..c3d45d83334 100644 --- a/erpnext/schools/doctype/program_course/program_course.json +++ b/erpnext/education/doctype/program_course/program_course.json @@ -145,9 +145,9 @@ "istable": 1, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:49.313349", + "modified": "2017-11-10 19:10:10.231463", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Course", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_course/program_course.py b/erpnext/education/doctype/program_course/program_course.py similarity index 100% rename from erpnext/schools/doctype/program_course/program_course.py rename to erpnext/education/doctype/program_course/program_course.py diff --git a/erpnext/schools/doctype/program_enrollment_course/__init__.py b/erpnext/education/doctype/program_enrollment/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_course/__init__.py rename to erpnext/education/doctype/program_enrollment/__init__.py diff --git a/erpnext/schools/doctype/program_enrollment/program_enrollment.js b/erpnext/education/doctype/program_enrollment/program_enrollment.js similarity index 87% rename from erpnext/schools/doctype/program_enrollment/program_enrollment.js rename to erpnext/education/doctype/program_enrollment/program_enrollment.js index 89728607fcb..d35f41a54bd 100644 --- a/erpnext/schools/doctype/program_enrollment/program_enrollment.js +++ b/erpnext/education/doctype/program_enrollment/program_enrollment.js @@ -26,7 +26,7 @@ frappe.ui.form.on("Program Enrollment", { if (frm.doc.program) { frm.set_query("course", "courses", function(doc, cdt, cdn) { return{ - query: "erpnext.schools.doctype.program_enrollment.program_enrollment.get_program_courses", + query: "erpnext.education.doctype.program_enrollment.program_enrollment.get_program_courses", filters: { 'program': frm.doc.program } @@ -36,7 +36,7 @@ frappe.ui.form.on("Program Enrollment", { frm.set_query("student", function() { return{ - query: "erpnext.schools.doctype.program_enrollment.program_enrollment.get_students", + query: "erpnext.education.doctype.program_enrollment.program_enrollment.get_students", filters: { 'academic_year': frm.doc.academic_year, 'academic_term': frm.doc.academic_term @@ -49,7 +49,7 @@ frappe.ui.form.on("Program Enrollment", { frm.events.get_courses(frm); if (frm.doc.program) { frappe.call({ - method: "erpnext.schools.api.get_fee_schedule", + method: "erpnext.education.api.get_fee_schedule", args: { "program": frm.doc.program, "student_category": frm.doc.student_category diff --git a/erpnext/schools/doctype/program_enrollment/program_enrollment.json b/erpnext/education/doctype/program_enrollment/program_enrollment.json similarity index 98% rename from erpnext/schools/doctype/program_enrollment/program_enrollment.json rename to erpnext/education/doctype/program_enrollment/program_enrollment.json index f8a3b9ecc8a..9badf933e77 100644 --- a/erpnext/schools/doctype/program_enrollment/program_enrollment.json +++ b/erpnext/education/doctype/program_enrollment/program_enrollment.json @@ -403,7 +403,7 @@ "label": "Mode of Transportation", "length": 0, "no_copy": 0, - "options": "\nWalking\nSchool Bus\nPublic Transport\nSelf-Driving Vehicle\nPick/Drop by Guardian", + "options": "\nWalking\nInstitute's Bus\nPublic Transport\nSelf-Driving Vehicle\nPick/Drop by Guardian", "permlevel": 0, "precision": "", "print_hide": 0, @@ -671,9 +671,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-07-10 18:16:15.810616", + "modified": "2017-11-16 13:20:28.650637", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Enrollment", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py similarity index 98% rename from erpnext/schools/doctype/program_enrollment/program_enrollment.py rename to erpnext/education/doctype/program_enrollment/program_enrollment.py index a6f7bdfe786..79772b0d02d 100644 --- a/erpnext/schools/doctype/program_enrollment/program_enrollment.py +++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py @@ -32,7 +32,7 @@ class ProgramEnrollment(Document): frappe.db.set_value("Student", self.student, "joining_date", date) def make_fee_records(self): - from erpnext.schools.api import get_fee_components + from erpnext.education.api import get_fee_components fee_list = [] for d in self.fees: fee_components = get_fee_components(d.fee_structure) diff --git a/erpnext/education/doctype/program_enrollment/test_program_enrollment.js b/erpnext/education/doctype/program_enrollment/test_program_enrollment.js new file mode 100644 index 00000000000..aea81a0714e --- /dev/null +++ b/erpnext/education/doctype/program_enrollment/test_program_enrollment.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Program Enrollment", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Program Enrollment + () => frappe.tests.make('Program Enrollment', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/schools/doctype/program_enrollment/test_program_enrollment.py b/erpnext/education/doctype/program_enrollment/test_program_enrollment.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment/test_program_enrollment.py rename to erpnext/education/doctype/program_enrollment/test_program_enrollment.py diff --git a/erpnext/schools/doctype/program_enrollment_fee/__init__.py b/erpnext/education/doctype/program_enrollment_course/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_fee/__init__.py rename to erpnext/education/doctype/program_enrollment_course/__init__.py diff --git a/erpnext/schools/doctype/program_enrollment_course/program_enrollment_course.json b/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.json similarity index 96% rename from erpnext/schools/doctype/program_enrollment_course/program_enrollment_course.json rename to erpnext/education/doctype/program_enrollment_course/program_enrollment_course.json index a5a26ab7ae4..87d9db3a1d5 100644 --- a/erpnext/schools/doctype/program_enrollment_course/program_enrollment_course.json +++ b/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.json @@ -85,9 +85,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:49.637920", + "modified": "2017-11-10 19:11:54.272255", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Enrollment Course", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_enrollment_course/program_enrollment_course.py b/erpnext/education/doctype/program_enrollment_course/program_enrollment_course.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_course/program_enrollment_course.py rename to erpnext/education/doctype/program_enrollment_course/program_enrollment_course.py diff --git a/erpnext/schools/doctype/program_enrollment_tool/__init__.py b/erpnext/education/doctype/program_enrollment_fee/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_tool/__init__.py rename to erpnext/education/doctype/program_enrollment_fee/__init__.py diff --git a/erpnext/schools/doctype/program_enrollment_fee/program_enrollment_fee.json b/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.json similarity index 98% rename from erpnext/schools/doctype/program_enrollment_fee/program_enrollment_fee.json rename to erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.json index 8d2202a8225..0af28155e29 100644 --- a/erpnext/schools/doctype/program_enrollment_fee/program_enrollment_fee.json +++ b/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.json @@ -173,9 +173,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:49.718726", + "modified": "2017-11-10 19:11:07.516632", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Enrollment Fee", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_enrollment_fee/program_enrollment_fee.py b/erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_fee/program_enrollment_fee.py rename to erpnext/education/doctype/program_enrollment_fee/program_enrollment_fee.py diff --git a/erpnext/schools/doctype/program_enrollment_tool_student/__init__.py b/erpnext/education/doctype/program_enrollment_tool/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_tool_student/__init__.py rename to erpnext/education/doctype/program_enrollment_tool/__init__.py diff --git a/erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.js b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js similarity index 100% rename from erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.js rename to erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.js diff --git a/erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.json b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json similarity index 99% rename from erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.json rename to erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json index 8f32df74b59..2745366f33d 100644 --- a/erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.json +++ b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.json @@ -328,9 +328,9 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:49.826296", + "modified": "2017-11-10 19:39:54.858394", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Enrollment Tool", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.py b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py similarity index 97% rename from erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.py rename to erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py index d80f2f5c6b0..d989d9f1d29 100644 --- a/erpnext/schools/doctype/program_enrollment_tool/program_enrollment_tool.py +++ b/erpnext/education/doctype/program_enrollment_tool/program_enrollment_tool.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.model.document import Document -from erpnext.schools.api import enroll_student +from erpnext.education.api import enroll_student class ProgramEnrollmentTool(Document): def get_students(self): diff --git a/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.js b/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.js new file mode 100644 index 00000000000..8d55104a0f3 --- /dev/null +++ b/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Program Enrollment Tool", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Program Enrollment Tool + () => frappe.tests.make('Program Enrollment Tool', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py b/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py new file mode 100644 index 00000000000..f22b3b1c8d4 --- /dev/null +++ b/erpnext/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestProgramEnrollmentTool(unittest.TestCase): + pass diff --git a/erpnext/schools/doctype/program_fee/__init__.py b/erpnext/education/doctype/program_enrollment_tool_student/__init__.py similarity index 100% rename from erpnext/schools/doctype/program_fee/__init__.py rename to erpnext/education/doctype/program_enrollment_tool_student/__init__.py diff --git a/erpnext/schools/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json b/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json similarity index 98% rename from erpnext/schools/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json rename to erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json index 50c9ac781da..0dbe1b87a9f 100644 --- a/erpnext/schools/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json +++ b/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.json @@ -145,9 +145,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:49.928790", + "modified": "2017-11-10 19:09:59.530615", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Enrollment Tool Student", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py b/erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py similarity index 100% rename from erpnext/schools/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py rename to erpnext/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py diff --git a/erpnext/schools/doctype/room/__init__.py b/erpnext/education/doctype/program_fee/__init__.py similarity index 100% rename from erpnext/schools/doctype/room/__init__.py rename to erpnext/education/doctype/program_fee/__init__.py diff --git a/erpnext/schools/doctype/program_fee/program_fee.json b/erpnext/education/doctype/program_fee/program_fee.json similarity index 98% rename from erpnext/schools/doctype/program_fee/program_fee.json rename to erpnext/education/doctype/program_fee/program_fee.json index 673959afe2b..d45e4bd240c 100644 --- a/erpnext/schools/doctype/program_fee/program_fee.json +++ b/erpnext/education/doctype/program_fee/program_fee.json @@ -205,9 +205,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:50.034899", + "modified": "2017-11-10 19:07:10.426335", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Program Fee", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/program_fee/program_fee.py b/erpnext/education/doctype/program_fee/program_fee.py similarity index 100% rename from erpnext/schools/doctype/program_fee/program_fee.py rename to erpnext/education/doctype/program_fee/program_fee.py diff --git a/erpnext/schools/doctype/school_house/__init__.py b/erpnext/education/doctype/room/__init__.py similarity index 100% rename from erpnext/schools/doctype/school_house/__init__.py rename to erpnext/education/doctype/room/__init__.py diff --git a/erpnext/schools/doctype/room/room.js b/erpnext/education/doctype/room/room.js similarity index 100% rename from erpnext/schools/doctype/room/room.js rename to erpnext/education/doctype/room/room.js diff --git a/erpnext/schools/doctype/room/room.json b/erpnext/education/doctype/room/room.json similarity index 97% rename from erpnext/schools/doctype/room/room.json rename to erpnext/education/doctype/room/room.json index 8e672ccd72e..6526766205a 100644 --- a/erpnext/schools/doctype/room/room.json +++ b/erpnext/education/doctype/room/room.json @@ -114,9 +114,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:50.145058", + "modified": "2017-11-10 19:04:32.237051", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Room", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/room/room.py b/erpnext/education/doctype/room/room.py similarity index 100% rename from erpnext/schools/doctype/room/room.py rename to erpnext/education/doctype/room/room.py diff --git a/erpnext/schools/doctype/room/test_records.json b/erpnext/education/doctype/room/test_records.json similarity index 100% rename from erpnext/schools/doctype/room/test_records.json rename to erpnext/education/doctype/room/test_records.json diff --git a/erpnext/schools/doctype/room/test_room.js b/erpnext/education/doctype/room/test_room.js similarity index 87% rename from erpnext/schools/doctype/room/test_room.js rename to erpnext/education/doctype/room/test_room.js index 0a93a8553f7..fdcbe92c17c 100644 --- a/erpnext/schools/doctype/room/test_room.js +++ b/erpnext/education/doctype/room/test_room.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in Education +QUnit.module('education'); QUnit.test('Test: Room', function(assert){ assert.expect(3); diff --git a/erpnext/schools/doctype/room/test_room.py b/erpnext/education/doctype/room/test_room.py similarity index 100% rename from erpnext/schools/doctype/room/test_room.py rename to erpnext/education/doctype/room/test_room.py diff --git a/erpnext/schools/doctype/school_settings/__init__.py b/erpnext/education/doctype/school_house/__init__.py similarity index 100% rename from erpnext/schools/doctype/school_settings/__init__.py rename to erpnext/education/doctype/school_house/__init__.py diff --git a/erpnext/schools/doctype/school_house/school_house.js b/erpnext/education/doctype/school_house/school_house.js similarity index 100% rename from erpnext/schools/doctype/school_house/school_house.js rename to erpnext/education/doctype/school_house/school_house.js diff --git a/erpnext/schools/doctype/school_house/school_house.json b/erpnext/education/doctype/school_house/school_house.json similarity index 96% rename from erpnext/schools/doctype/school_house/school_house.json rename to erpnext/education/doctype/school_house/school_house.json index e7779396a38..8a653a9730c 100644 --- a/erpnext/schools/doctype/school_house/school_house.json +++ b/erpnext/education/doctype/school_house/school_house.json @@ -54,9 +54,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:50.250616", + "modified": "2017-11-10 19:05:06.419022", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "School House", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/school_house/school_house.py b/erpnext/education/doctype/school_house/school_house.py similarity index 100% rename from erpnext/schools/doctype/school_house/school_house.py rename to erpnext/education/doctype/school_house/school_house.py diff --git a/erpnext/education/doctype/school_house/test_school_house.js b/erpnext/education/doctype/school_house/test_school_house.js new file mode 100644 index 00000000000..dde63ecc4c6 --- /dev/null +++ b/erpnext/education/doctype/school_house/test_school_house.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: School House", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new School House + () => frappe.tests.make('School House', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/schools/doctype/school_house/test_school_house.py b/erpnext/education/doctype/school_house/test_school_house.py similarity index 100% rename from erpnext/schools/doctype/school_house/test_school_house.py rename to erpnext/education/doctype/school_house/test_school_house.py diff --git a/erpnext/schools/doctype/student/__init__.py b/erpnext/education/doctype/student/__init__.py similarity index 100% rename from erpnext/schools/doctype/student/__init__.py rename to erpnext/education/doctype/student/__init__.py diff --git a/erpnext/schools/doctype/student/student.js b/erpnext/education/doctype/student/student.js similarity index 100% rename from erpnext/schools/doctype/student/student.js rename to erpnext/education/doctype/student/student.js diff --git a/erpnext/schools/doctype/student/student.json b/erpnext/education/doctype/student/student.json similarity index 99% rename from erpnext/schools/doctype/student/student.json rename to erpnext/education/doctype/student/student.json index 4961c2db8a8..62c21d3df50 100644 --- a/erpnext/schools/doctype/student/student.json +++ b/erpnext/education/doctype/student/student.json @@ -1114,9 +1114,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-07-26 19:46:26.893441", + "modified": "2017-11-10 19:03:36.495785", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student/student.py b/erpnext/education/doctype/student/student.py similarity index 100% rename from erpnext/schools/doctype/student/student.py rename to erpnext/education/doctype/student/student.py diff --git a/erpnext/schools/doctype/student/student_dashboard.py b/erpnext/education/doctype/student/student_dashboard.py similarity index 100% rename from erpnext/schools/doctype/student/student_dashboard.py rename to erpnext/education/doctype/student/student_dashboard.py diff --git a/erpnext/schools/doctype/student/student_list.js b/erpnext/education/doctype/student/student_list.js similarity index 100% rename from erpnext/schools/doctype/student/student_list.js rename to erpnext/education/doctype/student/student_list.js diff --git a/erpnext/schools/doctype/student/test_records.json b/erpnext/education/doctype/student/test_records.json similarity index 100% rename from erpnext/schools/doctype/student/test_records.json rename to erpnext/education/doctype/student/test_records.json diff --git a/erpnext/education/doctype/student/test_student.js b/erpnext/education/doctype/student/test_student.js new file mode 100644 index 00000000000..e18d39aee07 --- /dev/null +++ b/erpnext/education/doctype/student/test_student.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Student", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Student + () => frappe.tests.make('Student', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/schools/doctype/student/test_student.py b/erpnext/education/doctype/student/test_student.py similarity index 100% rename from erpnext/schools/doctype/student/test_student.py rename to erpnext/education/doctype/student/test_student.py diff --git a/erpnext/schools/doctype/student_admission/__init__.py b/erpnext/education/doctype/student_admission/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_admission/__init__.py rename to erpnext/education/doctype/student_admission/__init__.py diff --git a/erpnext/schools/doctype/student_admission/student_admission.js b/erpnext/education/doctype/student_admission/student_admission.js similarity index 100% rename from erpnext/schools/doctype/student_admission/student_admission.js rename to erpnext/education/doctype/student_admission/student_admission.js diff --git a/erpnext/schools/doctype/student_admission/student_admission.json b/erpnext/education/doctype/student_admission/student_admission.json similarity index 99% rename from erpnext/schools/doctype/student_admission/student_admission.json rename to erpnext/education/doctype/student_admission/student_admission.json index c35d5be3932..b3c10d43316 100644 --- a/erpnext/schools/doctype/student_admission/student_admission.json +++ b/erpnext/education/doctype/student_admission/student_admission.json @@ -356,9 +356,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-10-02 15:16:44.386000", + "modified": "2017-11-10 18:57:34.570376", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Admission", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_admission/student_admission.py b/erpnext/education/doctype/student_admission/student_admission.py similarity index 93% rename from erpnext/schools/doctype/student_admission/student_admission.py rename to erpnext/education/doctype/student_admission/student_admission.py index e166b9b5e80..2781c9c50cd 100644 --- a/erpnext/schools/doctype/student_admission/student_admission.py +++ b/erpnext/education/doctype/student_admission/student_admission.py @@ -34,7 +34,7 @@ def get_list_context(context=None): "show_sidebar": True, "title": _("Student Admissions"), "get_list": get_admission_list, - "row_template": "schools/doctype/student_admission/templates/student_admission_row.html", + "row_template": "education/doctype/student_admission/templates/student_admission_row.html", }) def get_admission_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"): diff --git a/erpnext/schools/doctype/student_admission/templates/student_admission.html b/erpnext/education/doctype/student_admission/templates/student_admission.html similarity index 100% rename from erpnext/schools/doctype/student_admission/templates/student_admission.html rename to erpnext/education/doctype/student_admission/templates/student_admission.html diff --git a/erpnext/schools/doctype/student_admission/templates/student_admission_row.html b/erpnext/education/doctype/student_admission/templates/student_admission_row.html similarity index 100% rename from erpnext/schools/doctype/student_admission/templates/student_admission_row.html rename to erpnext/education/doctype/student_admission/templates/student_admission_row.html diff --git a/erpnext/schools/doctype/student_admission/test_student_admission.js b/erpnext/education/doctype/student_admission/test_student_admission.js similarity index 95% rename from erpnext/schools/doctype/student_admission/test_student_admission.js rename to erpnext/education/doctype/student_admission/test_student_admission.js index 767f237f959..ed794b2482e 100644 --- a/erpnext/schools/doctype/student_admission/test_student_admission.js +++ b/erpnext/education/doctype/student_admission/test_student_admission.js @@ -1,5 +1,5 @@ -// Testing Admission Module in Schools -QUnit.module('schools'); +// Testing Admission Module in Education +QUnit.module('education'); QUnit.test('Test: Student Admission', function(assert) { assert.expect(10); diff --git a/erpnext/schools/doctype/student_admission/test_student_admission.py b/erpnext/education/doctype/student_admission/test_student_admission.py similarity index 100% rename from erpnext/schools/doctype/student_admission/test_student_admission.py rename to erpnext/education/doctype/student_admission/test_student_admission.py diff --git a/erpnext/schools/doctype/student_admission_program/__init__.py b/erpnext/education/doctype/student_admission_program/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_admission_program/__init__.py rename to erpnext/education/doctype/student_admission_program/__init__.py diff --git a/erpnext/schools/doctype/student_admission_program/student_admission_program.json b/erpnext/education/doctype/student_admission_program/student_admission_program.json similarity index 98% rename from erpnext/schools/doctype/student_admission_program/student_admission_program.json rename to erpnext/education/doctype/student_admission_program/student_admission_program.json index 29bb57fbd5f..46c5fabdb79 100644 --- a/erpnext/schools/doctype/student_admission_program/student_admission_program.json +++ b/erpnext/education/doctype/student_admission_program/student_admission_program.json @@ -204,9 +204,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-10-02 17:13:52.586218", + "modified": "2017-11-10 18:57:21.174604", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Admission Program", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_admission_program/student_admission_program.py b/erpnext/education/doctype/student_admission_program/student_admission_program.py similarity index 100% rename from erpnext/schools/doctype/student_admission_program/student_admission_program.py rename to erpnext/education/doctype/student_admission_program/student_admission_program.py diff --git a/erpnext/schools/doctype/student_applicant/__init__.py b/erpnext/education/doctype/student_applicant/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_applicant/__init__.py rename to erpnext/education/doctype/student_applicant/__init__.py diff --git a/erpnext/schools/doctype/student_applicant/student_applicant.js b/erpnext/education/doctype/student_applicant/student_applicant.js similarity index 96% rename from erpnext/schools/doctype/student_applicant/student_applicant.js rename to erpnext/education/doctype/student_applicant/student_applicant.js index fdf16bae0ac..83621c5725f 100644 --- a/erpnext/schools/doctype/student_applicant/student_applicant.js +++ b/erpnext/education/doctype/student_applicant/student_applicant.js @@ -40,7 +40,7 @@ frappe.ui.form.on("Student Applicant", { enroll: function(frm) { frappe.model.open_mapped_doc({ - method: "erpnext.schools.api.enroll_student", + method: "erpnext.education.api.enroll_student", frm: frm }) } diff --git a/erpnext/schools/doctype/student_applicant/student_applicant.json b/erpnext/education/doctype/student_applicant/student_applicant.json similarity index 99% rename from erpnext/schools/doctype/student_applicant/student_applicant.json rename to erpnext/education/doctype/student_applicant/student_applicant.json index 578f84ceff5..9c8423494b3 100644 --- a/erpnext/schools/doctype/student_applicant/student_applicant.json +++ b/erpnext/education/doctype/student_applicant/student_applicant.json @@ -1058,9 +1058,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-23 06:12:36.996978", + "modified": "2017-11-10 19:08:55.049625", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Applicant", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_applicant/student_applicant.py b/erpnext/education/doctype/student_applicant/student_applicant.py similarity index 100% rename from erpnext/schools/doctype/student_applicant/student_applicant.py rename to erpnext/education/doctype/student_applicant/student_applicant.py diff --git a/erpnext/schools/doctype/student_applicant/student_applicant_list.js b/erpnext/education/doctype/student_applicant/student_applicant_list.js similarity index 100% rename from erpnext/schools/doctype/student_applicant/student_applicant_list.js rename to erpnext/education/doctype/student_applicant/student_applicant_list.js diff --git a/erpnext/schools/doctype/student_applicant/test_student_applicant.py b/erpnext/education/doctype/student_applicant/test_student_applicant.py similarity index 100% rename from erpnext/schools/doctype/student_applicant/test_student_applicant.py rename to erpnext/education/doctype/student_applicant/test_student_applicant.py diff --git a/erpnext/schools/doctype/student_applicant/tests/test_student_applicant.js b/erpnext/education/doctype/student_applicant/tests/test_student_applicant.js similarity index 98% rename from erpnext/schools/doctype/student_applicant/tests/test_student_applicant.js rename to erpnext/education/doctype/student_applicant/tests/test_student_applicant.js index a45b45a6b9d..a69ad8a5646 100644 --- a/erpnext/schools/doctype/student_applicant/tests/test_student_applicant.js +++ b/erpnext/education/doctype/student_applicant/tests/test_student_applicant.js @@ -1,5 +1,5 @@ -// Testing Admission module in Schools -QUnit.module('schools'); +// Testing Admission module in Education +QUnit.module('education'); QUnit.test('Test: Student Applicant', function(assert){ assert.expect(24); diff --git a/erpnext/schools/doctype/student_applicant/tests/test_student_applicant_dummy_data.js b/erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js similarity index 100% rename from erpnext/schools/doctype/student_applicant/tests/test_student_applicant_dummy_data.js rename to erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js diff --git a/erpnext/schools/doctype/student_applicant/tests/test_student_applicant_options.js b/erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js similarity index 98% rename from erpnext/schools/doctype/student_applicant/tests/test_student_applicant_options.js rename to erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js index d8877e63e34..114358f32a1 100644 --- a/erpnext/schools/doctype/student_applicant/tests/test_student_applicant_options.js +++ b/erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js @@ -1,5 +1,5 @@ -// Testing Admission module in Schools -QUnit.module('schools'); +// Testing Admission module in Education +QUnit.module('education'); QUnit.test('test student applicant', function(assert){ assert.expect(11); diff --git a/erpnext/schools/doctype/student_attendance/__init__.py b/erpnext/education/doctype/student_attendance/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_attendance/__init__.py rename to erpnext/education/doctype/student_attendance/__init__.py diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.js b/erpnext/education/doctype/student_attendance/student_attendance.js similarity index 100% rename from erpnext/schools/doctype/student_attendance/student_attendance.js rename to erpnext/education/doctype/student_attendance/student_attendance.js diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.json b/erpnext/education/doctype/student_attendance/student_attendance.json similarity index 98% rename from erpnext/schools/doctype/student_attendance/student_attendance.json rename to erpnext/education/doctype/student_attendance/student_attendance.json index aa084cc15b4..07530b40a06 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.json +++ b/erpnext/education/doctype/student_attendance/student_attendance.json @@ -239,9 +239,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:51.223266", + "modified": "2017-11-10 19:09:51.041960", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Attendance", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.py b/erpnext/education/doctype/student_attendance/student_attendance.py similarity index 97% rename from erpnext/schools/doctype/student_attendance/student_attendance.py rename to erpnext/education/doctype/student_attendance/student_attendance.py index 696029680fd..06ac4fbc20b 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.py +++ b/erpnext/education/doctype/student_attendance/student_attendance.py @@ -7,7 +7,7 @@ import frappe from frappe.model.document import Document from frappe import _ from frappe.utils import cstr -from erpnext.schools.api import get_student_group_students +from erpnext.education.api import get_student_group_students class StudentAttendance(Document): diff --git a/erpnext/schools/doctype/student_attendance/student_attendance_list.js b/erpnext/education/doctype/student_attendance/student_attendance_list.js similarity index 100% rename from erpnext/schools/doctype/student_attendance/student_attendance_list.js rename to erpnext/education/doctype/student_attendance/student_attendance_list.js diff --git a/erpnext/schools/doctype/student_attendance/test_student_attendance.js b/erpnext/education/doctype/student_attendance/test_student_attendance.js similarity index 92% rename from erpnext/schools/doctype/student_attendance/test_student_attendance.js rename to erpnext/education/doctype/student_attendance/test_student_attendance.js index af83e77f3af..c7da6f6b246 100644 --- a/erpnext/schools/doctype/student_attendance/test_student_attendance.js +++ b/erpnext/education/doctype/student_attendance/test_student_attendance.js @@ -1,5 +1,5 @@ -// Testing Attendance Module in Schools -QUnit.module('schools'); +// Testing Attendance Module in Education +QUnit.module('education'); QUnit.test('Test: Student Attendance', function(assert){ assert.expect(2); diff --git a/erpnext/schools/doctype/student_attendance/test_student_attendance.py b/erpnext/education/doctype/student_attendance/test_student_attendance.py similarity index 100% rename from erpnext/schools/doctype/student_attendance/test_student_attendance.py rename to erpnext/education/doctype/student_attendance/test_student_attendance.py diff --git a/erpnext/schools/doctype/student_attendance_tool/__init__.py b/erpnext/education/doctype/student_attendance_tool/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_attendance_tool/__init__.py rename to erpnext/education/doctype/student_attendance_tool/__init__.py diff --git a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js similarity index 93% rename from erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js rename to erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js index 23ec40801f8..df6d13250a8 100644 --- a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.js +++ b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js @@ -1,6 +1,6 @@ // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -frappe.provide("schools") +frappe.provide("education"); frappe.ui.form.on('Student Attendance Tool', { onload: function(frm) { @@ -33,7 +33,7 @@ frappe.ui.form.on('Student Attendance Tool', { student_group: function(frm) { if ((frm.doc.student_group && frm.doc.date) || frm.doc.course_schedule) { - var method = "erpnext.schools.doctype.student_attendance_tool.student_attendance_tool.get_student_attendance_records"; + var method = "erpnext.education.doctype.student_attendance_tool.student_attendance_tool.get_student_attendance_records"; frappe.call({ method: method, @@ -64,12 +64,12 @@ frappe.ui.form.on('Student Attendance Tool', { .appendTo(frm.fields_dict.students_html.wrapper); } students = students || []; - frm.students_editor = new schools.StudentsEditor(frm, frm.students_area, students) + frm.students_editor = new education.StudentsEditor(frm, frm.students_area, students); } }); -schools.StudentsEditor = Class.extend({ +education.StudentsEditor = Class.extend({ init: function(frm, wrapper, students) { this.wrapper = wrapper; this.frm = frm; @@ -137,7 +137,7 @@ schools.StudentsEditor = Class.extend({ function() { //ifyes if(!frappe.request.ajax_count) { frappe.call({ - method: "erpnext.schools.api.mark_attendance", + method: "erpnext.education.api.mark_attendance", freeze: true, freeze_message: "Marking attendance", args: { diff --git a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.json b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.json similarity index 99% rename from erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.json rename to erpnext/education/doctype/student_attendance_tool/student_attendance_tool.json index 5c28655fa75..26b28b3ebee 100644 --- a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.json +++ b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.json @@ -273,9 +273,9 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-11-08 11:53:27.994112", + "modified": "2017-11-10 18:55:36.168044", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Attendance Tool", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.py b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py similarity index 100% rename from erpnext/schools/doctype/student_attendance_tool/student_attendance_tool.py rename to erpnext/education/doctype/student_attendance_tool/student_attendance_tool.py diff --git a/erpnext/schools/doctype/student_attendance_tool/test_student_attendance_tool.js b/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js similarity index 97% rename from erpnext/schools/doctype/student_attendance_tool/test_student_attendance_tool.js rename to erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js index 3044f20163d..19b32a99ec6 100644 --- a/erpnext/schools/doctype/student_attendance_tool/test_student_attendance_tool.js +++ b/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js @@ -1,5 +1,5 @@ -// Testing Attendance Module in Schools -QUnit.module('schools'); +// Testing Attendance Module in Education +QUnit.module('education'); QUnit.test('Test: Student Attendace Tool', function(assert){ assert.expect(10); diff --git a/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py b/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py new file mode 100644 index 00000000000..ffc42af4749 --- /dev/null +++ b/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestStudentAttendanceTool(unittest.TestCase): + pass diff --git a/erpnext/schools/doctype/student_batch_name/__init__.py b/erpnext/education/doctype/student_batch_name/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_batch_name/__init__.py rename to erpnext/education/doctype/student_batch_name/__init__.py diff --git a/erpnext/schools/doctype/student_batch_name/student_batch_name.js b/erpnext/education/doctype/student_batch_name/student_batch_name.js similarity index 100% rename from erpnext/schools/doctype/student_batch_name/student_batch_name.js rename to erpnext/education/doctype/student_batch_name/student_batch_name.js diff --git a/erpnext/schools/doctype/student_batch_name/student_batch_name.json b/erpnext/education/doctype/student_batch_name/student_batch_name.json similarity index 96% rename from erpnext/schools/doctype/student_batch_name/student_batch_name.json rename to erpnext/education/doctype/student_batch_name/student_batch_name.json index 6b0848701c4..abb64360101 100644 --- a/erpnext/schools/doctype/student_batch_name/student_batch_name.json +++ b/erpnext/education/doctype/student_batch_name/student_batch_name.json @@ -54,9 +54,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:51.545155", + "modified": "2017-11-10 19:08:17.980349", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Batch Name", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_batch_name/student_batch_name.py b/erpnext/education/doctype/student_batch_name/student_batch_name.py similarity index 100% rename from erpnext/schools/doctype/student_batch_name/student_batch_name.py rename to erpnext/education/doctype/student_batch_name/student_batch_name.py diff --git a/erpnext/schools/doctype/student_batch_name/test_records.json b/erpnext/education/doctype/student_batch_name/test_records.json similarity index 100% rename from erpnext/schools/doctype/student_batch_name/test_records.json rename to erpnext/education/doctype/student_batch_name/test_records.json diff --git a/erpnext/schools/doctype/student_batch_name/test_student_batch_name.js b/erpnext/education/doctype/student_batch_name/test_student_batch_name.js similarity index 83% rename from erpnext/schools/doctype/student_batch_name/test_student_batch_name.js rename to erpnext/education/doctype/student_batch_name/test_student_batch_name.js index 6a10dc1e35e..6c761b8418b 100644 --- a/erpnext/schools/doctype/student_batch_name/test_student_batch_name.js +++ b/erpnext/education/doctype/student_batch_name/test_student_batch_name.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in Education +QUnit.module('education'); QUnit.test('Test: Student Batch Name', function(assert){ assert.expect(1); diff --git a/erpnext/schools/doctype/student_batch_name/test_student_batch_name.py b/erpnext/education/doctype/student_batch_name/test_student_batch_name.py similarity index 100% rename from erpnext/schools/doctype/student_batch_name/test_student_batch_name.py rename to erpnext/education/doctype/student_batch_name/test_student_batch_name.py diff --git a/erpnext/schools/doctype/student_category/__init__.py b/erpnext/education/doctype/student_category/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_category/__init__.py rename to erpnext/education/doctype/student_category/__init__.py diff --git a/erpnext/schools/doctype/student_category/student_category.js b/erpnext/education/doctype/student_category/student_category.js similarity index 100% rename from erpnext/schools/doctype/student_category/student_category.js rename to erpnext/education/doctype/student_category/student_category.js diff --git a/erpnext/schools/doctype/student_category/student_category.json b/erpnext/education/doctype/student_category/student_category.json similarity index 96% rename from erpnext/schools/doctype/student_category/student_category.json rename to erpnext/education/doctype/student_category/student_category.json index ce4cb4e58da..d7d4444a281 100644 --- a/erpnext/schools/doctype/student_category/student_category.json +++ b/erpnext/education/doctype/student_category/student_category.json @@ -53,9 +53,9 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-06-30 08:21:51.652539", + "modified": "2017-11-10 19:09:45.783401", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Category", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_category/student_category.py b/erpnext/education/doctype/student_category/student_category.py similarity index 100% rename from erpnext/schools/doctype/student_category/student_category.py rename to erpnext/education/doctype/student_category/student_category.py diff --git a/erpnext/schools/doctype/student_category/test_student_category.js b/erpnext/education/doctype/student_category/test_student_category.js similarity index 84% rename from erpnext/schools/doctype/student_category/test_student_category.js rename to erpnext/education/doctype/student_category/test_student_category.js index 5e3109a6bb3..01f50e279dc 100644 --- a/erpnext/schools/doctype/student_category/test_student_category.js +++ b/erpnext/education/doctype/student_category/test_student_category.js @@ -1,5 +1,5 @@ -// Testing Setup Module in Schools -QUnit.module('schools'); +// Testing Setup Module in Education +QUnit.module('education'); QUnit.test('Test: Student Category', function(assert){ assert.expect(1); diff --git a/erpnext/schools/doctype/student_category/test_student_category.py b/erpnext/education/doctype/student_category/test_student_category.py similarity index 100% rename from erpnext/schools/doctype/student_category/test_student_category.py rename to erpnext/education/doctype/student_category/test_student_category.py diff --git a/erpnext/schools/doctype/student_group/__init__.py b/erpnext/education/doctype/student_group/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_group/__init__.py rename to erpnext/education/doctype/student_group/__init__.py diff --git a/erpnext/schools/doctype/student_group/student_group.js b/erpnext/education/doctype/student_group/student_group.js similarity index 93% rename from erpnext/schools/doctype/student_group/student_group.js rename to erpnext/education/doctype/student_group/student_group.js index 80355a8b947..f3f8c886247 100644 --- a/erpnext/schools/doctype/student_group/student_group.js +++ b/erpnext/education/doctype/student_group/student_group.js @@ -12,7 +12,7 @@ frappe.ui.form.on("Student Group", { if (!frm.__islocal) { frm.set_query("student", "students", function() { return{ - query: "erpnext.schools.doctype.student_group.student_group.fetch_students", + query: "erpnext.education.doctype.student_group.student_group.fetch_students", filters: { 'academic_year': frm.doc.academic_year, 'group_based_on': frm.doc.group_based_on, @@ -50,7 +50,7 @@ frappe.ui.form.on("Student Group", { }); frm.add_custom_button(__("Update Email Group"), function() { frappe.call({ - method: "erpnext.schools.api.update_email_group", + method: "erpnext.education.api.update_email_group", args: { "doctype": "Student Group", "name": frm.doc.name @@ -83,7 +83,7 @@ frappe.ui.form.on("Student Group", { } }); frappe.call({ - method: "erpnext.schools.doctype.student_group.student_group.get_students", + method: "erpnext.education.doctype.student_group.student_group.get_students", args: { "academic_year": frm.doc.academic_year, "academic_term": frm.doc.academic_term, diff --git a/erpnext/schools/doctype/student_group/student_group.json b/erpnext/education/doctype/student_group/student_group.json similarity index 99% rename from erpnext/schools/doctype/student_group/student_group.json rename to erpnext/education/doctype/student_group/student_group.json index 0a9b41a8554..37a611b33da 100644 --- a/erpnext/schools/doctype/student_group/student_group.json +++ b/erpnext/education/doctype/student_group/student_group.json @@ -459,9 +459,9 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-06-30 08:21:51.755519", + "modified": "2017-11-10 19:09:37.370864", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Group", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_group/student_group.py b/erpnext/education/doctype/student_group/student_group.py similarity index 98% rename from erpnext/schools/doctype/student_group/student_group.py rename to erpnext/education/doctype/student_group/student_group.py index 950632ba508..d5085894090 100644 --- a/erpnext/schools/doctype/student_group/student_group.py +++ b/erpnext/education/doctype/student_group/student_group.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe import _ -from erpnext.schools.utils import validate_duplicate_student +from erpnext.education.utils import validate_duplicate_student from frappe.utils import cint class StudentGroup(Document): diff --git a/erpnext/schools/doctype/student_group/test_records.json b/erpnext/education/doctype/student_group/test_records.json similarity index 100% rename from erpnext/schools/doctype/student_group/test_records.json rename to erpnext/education/doctype/student_group/test_records.json diff --git a/erpnext/schools/doctype/student_group/test_student_group.js b/erpnext/education/doctype/student_group/test_student_group.js similarity index 95% rename from erpnext/schools/doctype/student_group/test_student_group.js rename to erpnext/education/doctype/student_group/test_student_group.js index bee5067d9b8..6673343be7e 100644 --- a/erpnext/schools/doctype/student_group/test_student_group.js +++ b/erpnext/education/doctype/student_group/test_student_group.js @@ -1,5 +1,5 @@ -// Testing Student Module in Schools -QUnit.module('schools'); +// Testing Student Module in Education +QUnit.module('education'); QUnit.test('Test: Student Group', function(assert){ assert.expect(2); diff --git a/erpnext/schools/doctype/student_group/test_student_group.py b/erpnext/education/doctype/student_group/test_student_group.py similarity index 100% rename from erpnext/schools/doctype/student_group/test_student_group.py rename to erpnext/education/doctype/student_group/test_student_group.py diff --git a/erpnext/schools/doctype/student_group_creation_tool/__init__.py b/erpnext/education/doctype/student_group_creation_tool/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_group_creation_tool/__init__.py rename to erpnext/education/doctype/student_group_creation_tool/__init__.py diff --git a/erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.js b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.js similarity index 100% rename from erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.js rename to erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.js diff --git a/erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.json b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.json similarity index 98% rename from erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.json rename to erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.json index a6ed9898682..d759b9178e2 100644 --- a/erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.json +++ b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.json @@ -269,9 +269,9 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-07-17 21:57:35.602091", + "modified": "2017-11-10 19:40:07.862203", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Group Creation Tool", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.py b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py similarity index 95% rename from erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.py rename to erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py index 649e5daedf3..643093ee485 100644 --- a/erpnext/schools/doctype/student_group_creation_tool/student_group_creation_tool.py +++ b/erpnext/education/doctype/student_group_creation_tool/student_group_creation_tool.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.model.document import Document -from erpnext.schools.doctype.student_group.student_group import get_students +from erpnext.education.doctype.student_group.student_group import get_students class StudentGroupCreationTool(Document): def get_courses(self): diff --git a/erpnext/schools/doctype/student_group_creation_tool/test_student_group_creation_tool.js b/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js similarity index 98% rename from erpnext/schools/doctype/student_group_creation_tool/test_student_group_creation_tool.js rename to erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js index a8567b3ba01..34c10930b57 100644 --- a/erpnext/schools/doctype/student_group_creation_tool/test_student_group_creation_tool.js +++ b/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js @@ -1,4 +1,4 @@ -QUnit.module('schools'); +QUnit.module('education'); QUnit.test('Test: Student Group Creation Tool', function(assert){ assert.expect(5); diff --git a/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py b/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py new file mode 100644 index 00000000000..9ca56588f2c --- /dev/null +++ b/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestStudentGroupCreationTool(unittest.TestCase): + pass diff --git a/erpnext/schools/doctype/student_group_creation_tool_course/__init__.py b/erpnext/education/doctype/student_group_creation_tool_course/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_group_creation_tool_course/__init__.py rename to erpnext/education/doctype/student_group_creation_tool_course/__init__.py diff --git a/erpnext/schools/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json b/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json similarity index 98% rename from erpnext/schools/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json rename to erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json index d945d4b7e59..a749929ffd9 100644 --- a/erpnext/schools/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json +++ b/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.json @@ -236,9 +236,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-05-15 14:18:23.435415", + "modified": "2017-11-10 19:08:27.657591", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Group Creation Tool Course", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py b/erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py similarity index 100% rename from erpnext/schools/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py rename to erpnext/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py diff --git a/erpnext/schools/doctype/student_group_instructor/__init__.py b/erpnext/education/doctype/student_group_instructor/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_group_instructor/__init__.py rename to erpnext/education/doctype/student_group_instructor/__init__.py diff --git a/erpnext/schools/doctype/student_group_instructor/student_group_instructor.json b/erpnext/education/doctype/student_group_instructor/student_group_instructor.json similarity index 94% rename from erpnext/schools/doctype/student_group_instructor/student_group_instructor.json rename to erpnext/education/doctype/student_group_instructor/student_group_instructor.json index 541e9b336b0..c09d7d3a1c0 100644 --- a/erpnext/schools/doctype/student_group_instructor/student_group_instructor.json +++ b/erpnext/education/doctype/student_group_instructor/student_group_instructor.json @@ -13,6 +13,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -43,6 +44,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -71,6 +73,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -111,9 +114,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-04-17 16:06:05.792863", + "modified": "2017-11-10 19:11:31.439735", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Group Instructor", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_group_instructor/student_group_instructor.py b/erpnext/education/doctype/student_group_instructor/student_group_instructor.py similarity index 100% rename from erpnext/schools/doctype/student_group_instructor/student_group_instructor.py rename to erpnext/education/doctype/student_group_instructor/student_group_instructor.py diff --git a/erpnext/schools/doctype/student_group_student/__init__.py b/erpnext/education/doctype/student_group_student/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_group_student/__init__.py rename to erpnext/education/doctype/student_group_student/__init__.py diff --git a/erpnext/schools/doctype/student_group_student/student_group_student.json b/erpnext/education/doctype/student_group_student/student_group_student.json similarity index 95% rename from erpnext/schools/doctype/student_group_student/student_group_student.json rename to erpnext/education/doctype/student_group_student/student_group_student.json index 5fc434adf44..3ff339ffb22 100644 --- a/erpnext/schools/doctype/student_group_student/student_group_student.json +++ b/erpnext/education/doctype/student_group_student/student_group_student.json @@ -12,6 +12,7 @@ "editable_grid": 1, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -42,6 +43,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -71,6 +73,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -99,6 +102,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -128,6 +132,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -168,9 +173,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-04-12 14:56:07.532226", + "modified": "2017-11-10 19:11:39.735521", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Group Student", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_group_student/student_group_student.py b/erpnext/education/doctype/student_group_student/student_group_student.py similarity index 100% rename from erpnext/schools/doctype/student_group_student/student_group_student.py rename to erpnext/education/doctype/student_group_student/student_group_student.py diff --git a/erpnext/schools/doctype/student_guardian/__init__.py b/erpnext/education/doctype/student_guardian/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_guardian/__init__.py rename to erpnext/education/doctype/student_guardian/__init__.py diff --git a/erpnext/schools/doctype/student_guardian/student_guardian.json b/erpnext/education/doctype/student_guardian/student_guardian.json similarity index 93% rename from erpnext/schools/doctype/student_guardian/student_guardian.json rename to erpnext/education/doctype/student_guardian/student_guardian.json index b5f9d884d08..b4844fd6fb9 100644 --- a/erpnext/schools/doctype/student_guardian/student_guardian.json +++ b/erpnext/education/doctype/student_guardian/student_guardian.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "beta": 0, @@ -11,6 +12,7 @@ "editable_grid": 1, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -41,6 +43,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -70,6 +73,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -100,19 +104,19 @@ "unique": 0 } ], + "has_web_view": 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": "2017-02-17 17:13:53.507571", + "modified": "2017-11-10 19:10:57.680471", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Guardian", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_guardian/student_guardian.py b/erpnext/education/doctype/student_guardian/student_guardian.py similarity index 100% rename from erpnext/schools/doctype/student_guardian/student_guardian.py rename to erpnext/education/doctype/student_guardian/student_guardian.py diff --git a/erpnext/schools/doctype/student_language/__init__.py b/erpnext/education/doctype/student_language/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_language/__init__.py rename to erpnext/education/doctype/student_language/__init__.py diff --git a/erpnext/schools/doctype/student_language/student_language.js b/erpnext/education/doctype/student_language/student_language.js similarity index 100% rename from erpnext/schools/doctype/student_language/student_language.js rename to erpnext/education/doctype/student_language/student_language.js diff --git a/erpnext/schools/doctype/student_language/student_language.json b/erpnext/education/doctype/student_language/student_language.json similarity index 91% rename from erpnext/schools/doctype/student_language/student_language.json rename to erpnext/education/doctype/student_language/student_language.json index f3b4eb13478..43e6dbdbcb1 100644 --- a/erpnext/schools/doctype/student_language/student_language.json +++ b/erpnext/education/doctype/student_language/student_language.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "autoname": "field:language_name", @@ -13,6 +14,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -24,7 +26,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Language Name", "length": 0, @@ -42,19 +44,19 @@ "unique": 0 } ], + "has_web_view": 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": "2017-02-22 13:03:48.600707", + "modified": "2017-11-10 19:05:37.035846", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Language", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_language/student_language.py b/erpnext/education/doctype/student_language/student_language.py similarity index 100% rename from erpnext/schools/doctype/student_language/student_language.py rename to erpnext/education/doctype/student_language/student_language.py diff --git a/erpnext/education/doctype/student_language/test_student_language.js b/erpnext/education/doctype/student_language/test_student_language.js new file mode 100644 index 00000000000..9b25569961a --- /dev/null +++ b/erpnext/education/doctype/student_language/test_student_language.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Student Language", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Student Language + () => frappe.tests.make('Student Language', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/schools/doctype/student_language/test_student_language.py b/erpnext/education/doctype/student_language/test_student_language.py similarity index 100% rename from erpnext/schools/doctype/student_language/test_student_language.py rename to erpnext/education/doctype/student_language/test_student_language.py diff --git a/erpnext/schools/doctype/student_leave_application/__init__.py b/erpnext/education/doctype/student_leave_application/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_leave_application/__init__.py rename to erpnext/education/doctype/student_leave_application/__init__.py diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.js b/erpnext/education/doctype/student_leave_application/student_leave_application.js similarity index 100% rename from erpnext/schools/doctype/student_leave_application/student_leave_application.js rename to erpnext/education/doctype/student_leave_application/student_leave_application.js diff --git a/erpnext/education/doctype/student_leave_application/student_leave_application.json b/erpnext/education/doctype/student_leave_application/student_leave_application.json new file mode 100644 index 00000000000..93ff1ad58b9 --- /dev/null +++ b/erpnext/education/doctype/student_leave_application/student_leave_application.json @@ -0,0 +1,357 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "SLA.######", + "beta": 0, + "creation": "2016-11-28 15:38:54.793854", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "student", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Student", + "length": 0, + "no_copy": 0, + "options": "Student", + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "student_name", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Student Name", + "length": 0, + "no_copy": 0, + "options": "student.title", + "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, + "fieldname": "column_break_3", + "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, + "label": "", + "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, + "fieldname": "from_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "From Date", + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "to_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "To Date", + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Will show the student as Present in Student Monthly Attendance Report", + "fieldname": "mark_as_present", + "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": "Mark as Present", + "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, + "fieldname": "section_break_5", + "fieldtype": "Section 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, + "fieldname": "reason", + "fieldtype": "Text", + "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": "Reason", + "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, + "fieldname": "amended_from", + "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": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Student Leave Application", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-11-10 19:09:31.848381", + "modified_by": "Administrator", + "module": "Education", + "name": "Student Leave Application", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "restrict_to_domain": "Education", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "student_name", + "track_changes": 0, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.py b/erpnext/education/doctype/student_leave_application/student_leave_application.py similarity index 100% rename from erpnext/schools/doctype/student_leave_application/student_leave_application.py rename to erpnext/education/doctype/student_leave_application/student_leave_application.py diff --git a/erpnext/schools/doctype/student_leave_application/test_student_leave_application.js b/erpnext/education/doctype/student_leave_application/test_student_leave_application.js similarity index 96% rename from erpnext/schools/doctype/student_leave_application/test_student_leave_application.js rename to erpnext/education/doctype/student_leave_application/test_student_leave_application.js index d7a69736691..5af9f5d50f7 100644 --- a/erpnext/schools/doctype/student_leave_application/test_student_leave_application.js +++ b/erpnext/education/doctype/student_leave_application/test_student_leave_application.js @@ -1,5 +1,5 @@ -// Testing Attendance Module in Schools -QUnit.module('schools'); +// Testing Attendance Module in Education +QUnit.module('education'); QUnit.test('Test: Student Leave Application', function(assert){ assert.expect(4); diff --git a/erpnext/schools/doctype/student_leave_application/test_student_leave_application.py b/erpnext/education/doctype/student_leave_application/test_student_leave_application.py similarity index 100% rename from erpnext/schools/doctype/student_leave_application/test_student_leave_application.py rename to erpnext/education/doctype/student_leave_application/test_student_leave_application.py diff --git a/erpnext/schools/doctype/student_log/__init__.py b/erpnext/education/doctype/student_log/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_log/__init__.py rename to erpnext/education/doctype/student_log/__init__.py diff --git a/erpnext/schools/doctype/student_log/student_log.js b/erpnext/education/doctype/student_log/student_log.js similarity index 100% rename from erpnext/schools/doctype/student_log/student_log.js rename to erpnext/education/doctype/student_log/student_log.js diff --git a/erpnext/education/doctype/student_log/student_log.json b/erpnext/education/doctype/student_log/student_log.json new file mode 100644 index 00000000000..9d55bb95732 --- /dev/null +++ b/erpnext/education/doctype/student_log/student_log.json @@ -0,0 +1,400 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "SLog.####", + "beta": 0, + "creation": "2016-07-29 03:27:22.451772", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "student", + "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": 1, + "label": "Student", + "length": 0, + "no_copy": 0, + "options": "Student", + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "student_name", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Student Name", + "length": 0, + "no_copy": 0, + "options": "student.title", + "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, + "fieldname": "type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Type", + "length": 0, + "no_copy": 0, + "options": "General\nAcademic\nMedical\nAchievement", + "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, + "fieldname": "date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Date", + "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, + "fieldname": "column_break_3", + "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, + "fieldname": "academic_year", + "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": "Academic Year", + "length": 0, + "no_copy": 0, + "options": "Academic Year", + "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, + "fieldname": "academic_term", + "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": "Academic Term", + "length": 0, + "no_copy": 0, + "options": "Academic Term", + "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, + "fieldname": "program", + "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": "Program", + "length": 0, + "no_copy": 0, + "options": "Program", + "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, + "fieldname": "student_batch", + "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": "Student Batch", + "length": 0, + "no_copy": 0, + "options": "Student Batch Name", + "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, + "fieldname": "section_break_5", + "fieldtype": "Section 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, + "fieldname": "log", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 1, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Log", + "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2017-11-10 19:04:50.483773", + "modified_by": "Administrator", + "module": "Education", + "name": "Student Log", + "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, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 0, + "read_only": 0, + "read_only_onload": 0, + "restrict_to_domain": "Education", + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "student_name", + "track_changes": 0, + "track_seen": 1 +} \ No newline at end of file diff --git a/erpnext/schools/doctype/student_log/student_log.py b/erpnext/education/doctype/student_log/student_log.py similarity index 100% rename from erpnext/schools/doctype/student_log/student_log.py rename to erpnext/education/doctype/student_log/student_log.py diff --git a/erpnext/schools/doctype/student_log/test_student_log.js b/erpnext/education/doctype/student_log/test_student_log.js similarity index 94% rename from erpnext/schools/doctype/student_log/test_student_log.js rename to erpnext/education/doctype/student_log/test_student_log.js index 8f8d152f8c7..5775369e52e 100644 --- a/erpnext/schools/doctype/student_log/test_student_log.js +++ b/erpnext/education/doctype/student_log/test_student_log.js @@ -1,5 +1,5 @@ -// Testing Student Module in Schools -QUnit.module('schools'); +// Testing Student Module in Education +QUnit.module('education'); QUnit.test('Test: Student Log', function(assert){ assert.expect(9); diff --git a/erpnext/schools/doctype/student_log/test_student_log.py b/erpnext/education/doctype/student_log/test_student_log.py similarity index 100% rename from erpnext/schools/doctype/student_log/test_student_log.py rename to erpnext/education/doctype/student_log/test_student_log.py diff --git a/erpnext/schools/doctype/student_sibling/__init__.py b/erpnext/education/doctype/student_sibling/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_sibling/__init__.py rename to erpnext/education/doctype/student_sibling/__init__.py diff --git a/erpnext/schools/doctype/student_sibling/student_sibling.json b/erpnext/education/doctype/student_sibling/student_sibling.json similarity index 95% rename from erpnext/schools/doctype/student_sibling/student_sibling.json rename to erpnext/education/doctype/student_sibling/student_sibling.json index fb698d92851..22b71824a98 100644 --- a/erpnext/schools/doctype/student_sibling/student_sibling.json +++ b/erpnext/education/doctype/student_sibling/student_sibling.json @@ -12,6 +12,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -42,6 +43,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -72,6 +74,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -103,6 +106,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -131,6 +135,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -162,6 +167,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -192,6 +198,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -221,6 +228,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -261,9 +269,9 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-03-08 11:26:41.717041", + "modified": "2017-11-10 19:05:24.999063", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Sibling", "name_case": "", "owner": "Administrator", diff --git a/erpnext/schools/doctype/student_sibling/student_sibling.py b/erpnext/education/doctype/student_sibling/student_sibling.py similarity index 100% rename from erpnext/schools/doctype/student_sibling/student_sibling.py rename to erpnext/education/doctype/student_sibling/student_sibling.py diff --git a/erpnext/schools/doctype/student_siblings/__init__.py b/erpnext/education/doctype/student_siblings/__init__.py similarity index 100% rename from erpnext/schools/doctype/student_siblings/__init__.py rename to erpnext/education/doctype/student_siblings/__init__.py diff --git a/erpnext/schools/doctype/student_siblings/student_siblings.json b/erpnext/education/doctype/student_siblings/student_siblings.json similarity index 81% rename from erpnext/schools/doctype/student_siblings/student_siblings.json rename to erpnext/education/doctype/student_siblings/student_siblings.json index 4f1ed0294cc..0fdc2fd70a2 100644 --- a/erpnext/schools/doctype/student_siblings/student_siblings.json +++ b/erpnext/education/doctype/student_siblings/student_siblings.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "beta": 0, @@ -11,6 +12,7 @@ "editable_grid": 1, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -21,7 +23,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Name", "length": 0, "no_copy": 0, @@ -31,6 +35,7 @@ "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, @@ -38,6 +43,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -48,7 +54,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Gender", "length": 0, "no_copy": 0, @@ -58,6 +66,7 @@ "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, @@ -65,6 +74,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -75,7 +85,9 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Date of Birth", "length": 0, "no_copy": 0, @@ -84,6 +96,7 @@ "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, @@ -91,19 +104,19 @@ "unique": 0 } ], + "has_web_view": 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-09-01 14:41:23.824083", + "modified": "2017-11-10 19:05:46.408887", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Siblings", "name_case": "", "owner": "Administrator", @@ -111,7 +124,9 @@ "quick_entry": 1, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", + "track_changes": 0, "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/schools/doctype/student_siblings/student_siblings.py b/erpnext/education/doctype/student_siblings/student_siblings.py similarity index 100% rename from erpnext/schools/doctype/student_siblings/student_siblings.py rename to erpnext/education/doctype/student_siblings/student_siblings.py diff --git a/erpnext/schools/report/__init__.py b/erpnext/education/report/__init__.py similarity index 100% rename from erpnext/schools/report/__init__.py rename to erpnext/education/report/__init__.py diff --git a/erpnext/schools/report/absent_student_report/__init__.py b/erpnext/education/report/absent_student_report/__init__.py similarity index 100% rename from erpnext/schools/report/absent_student_report/__init__.py rename to erpnext/education/report/absent_student_report/__init__.py diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.js b/erpnext/education/report/absent_student_report/absent_student_report.js similarity index 100% rename from erpnext/schools/report/absent_student_report/absent_student_report.js rename to erpnext/education/report/absent_student_report/absent_student_report.js diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.json b/erpnext/education/report/absent_student_report/absent_student_report.json similarity index 86% rename from erpnext/schools/report/absent_student_report/absent_student_report.json rename to erpnext/education/report/absent_student_report/absent_student_report.json index 3a2e85f83e8..0d5eebabf8c 100644 --- a/erpnext/schools/report/absent_student_report/absent_student_report.json +++ b/erpnext/education/report/absent_student_report/absent_student_report.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 3, "is_standard": "Yes", - "modified": "2017-02-24 20:03:01.035036", + "modified": "2017-11-10 19:42:36.457449", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Absent Student Report", "owner": "Administrator", "ref_doctype": "Student Attendance", diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.py b/erpnext/education/report/absent_student_report/absent_student_report.py similarity index 100% rename from erpnext/schools/report/absent_student_report/absent_student_report.py rename to erpnext/education/report/absent_student_report/absent_student_report.py diff --git a/erpnext/schools/report/course_wise_assessment_report/__init__.py b/erpnext/education/report/course_wise_assessment_report/__init__.py similarity index 100% rename from erpnext/schools/report/course_wise_assessment_report/__init__.py rename to erpnext/education/report/course_wise_assessment_report/__init__.py diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.html b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.html similarity index 100% rename from erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.html rename to erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.html diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.js b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.js similarity index 100% rename from erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.js rename to erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.js diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.json b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.json similarity index 87% rename from erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.json rename to erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.json index 6b089d276ff..e153f8c55b5 100644 --- a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.json +++ b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2017-05-05 14:47:18.080385", + "modified": "2017-11-10 19:41:46.641227", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Course wise Assessment Report", "owner": "Administrator", "ref_doctype": "Assessment Result", diff --git a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py similarity index 99% rename from erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py rename to erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py index 492d7384480..ff172381b3e 100644 --- a/erpnext/schools/report/course_wise_assessment_report/course_wise_assessment_report.py +++ b/erpnext/education/report/course_wise_assessment_report/course_wise_assessment_report.py @@ -6,7 +6,7 @@ import frappe from frappe import _ from frappe.utils import flt from collections import defaultdict -from erpnext.schools.api import get_grade +from erpnext.education.api import get_grade def execute(filters=None): diff --git a/erpnext/schools/report/student_and_guardian_contact_details/__init__.py b/erpnext/education/report/student_and_guardian_contact_details/__init__.py similarity index 100% rename from erpnext/schools/report/student_and_guardian_contact_details/__init__.py rename to erpnext/education/report/student_and_guardian_contact_details/__init__.py diff --git a/erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js similarity index 100% rename from erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js rename to erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js diff --git a/erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json similarity index 88% rename from erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json rename to erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json index e8225490bf9..fe7d1586c86 100644 --- a/erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json +++ b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2017-03-27 18:34:08.867661", + "modified": "2017-11-10 19:42:30.300729", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student and Guardian Contact Details", "owner": "Administrator", "ref_doctype": "Program Enrollment", diff --git a/erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py b/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py similarity index 100% rename from erpnext/schools/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py rename to erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py diff --git a/erpnext/schools/report/student_batch_wise_attendance/__init__.py b/erpnext/education/report/student_batch_wise_attendance/__init__.py similarity index 100% rename from erpnext/schools/report/student_batch_wise_attendance/__init__.py rename to erpnext/education/report/student_batch_wise_attendance/__init__.py diff --git a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.js b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.js similarity index 100% rename from erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.js rename to erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.js diff --git a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json similarity index 87% rename from erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json rename to erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json index 7851cbb8e63..eb547b71025 100644 --- a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json +++ b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 2, "is_standard": "Yes", - "modified": "2017-02-24 20:02:33.773899", + "modified": "2017-11-10 19:41:12.328346", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Batch-Wise Attendance", "owner": "Administrator", "ref_doctype": "Student Attendance", diff --git a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.py b/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py similarity index 100% rename from erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.py rename to erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py diff --git a/erpnext/schools/report/student_fee_collection/__init__.py b/erpnext/education/report/student_fee_collection/__init__.py similarity index 100% rename from erpnext/schools/report/student_fee_collection/__init__.py rename to erpnext/education/report/student_fee_collection/__init__.py diff --git a/erpnext/schools/report/student_fee_collection/student_fee_collection.json b/erpnext/education/report/student_fee_collection/student_fee_collection.json similarity index 91% rename from erpnext/schools/report/student_fee_collection/student_fee_collection.json rename to erpnext/education/report/student_fee_collection/student_fee_collection.json index 5c63765cf8f..07fc27c7a08 100644 --- a/erpnext/schools/report/student_fee_collection/student_fee_collection.json +++ b/erpnext/education/report/student_fee_collection/student_fee_collection.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 3, "is_standard": "Yes", - "modified": "2017-10-25 11:59:26.003899", + "modified": "2017-11-10 19:41:37.320224", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Fee Collection", "owner": "Administrator", "query": "SELECT\n student as \"Student:Link/Student:200\",\n student_name as \"Student Name::200\",\n sum(paid_amount) as \"Paid Amount:Currency:150\",\n sum(outstanding_amount) as \"Outstanding Amount:Currency:150\",\n sum(grand_total) as \"Grand Total:Currency:150\"\nFROM\n `tabFees` \nGROUP BY\n student", diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/__init__.py b/erpnext/education/report/student_monthly_attendance_sheet/__init__.py similarity index 100% rename from erpnext/schools/report/student_monthly_attendance_sheet/__init__.py rename to erpnext/education/report/student_monthly_attendance_sheet/__init__.py diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js similarity index 89% rename from erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js rename to erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js index 943238ece26..402bb02e974 100644 --- a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js +++ b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js @@ -29,7 +29,7 @@ frappe.query_reports["Student Monthly Attendance Sheet"] = { "onload": function() { return frappe.call({ - method: "erpnext.schools.report.student_monthly_attendance_sheet.student_monthly_attendance_sheet.get_attendance_years", + method: "erpnext.education.report.student_monthly_attendance_sheet.student_monthly_attendance_sheet.get_attendance_years", callback: function(r) { var year_filter = frappe.query_report_filters_by_name.year; year_filter.df.options = r.message; diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json similarity index 87% rename from erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json rename to erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json index a6531de22ea..e10f190e1c7 100644 --- a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json +++ b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json @@ -7,9 +7,9 @@ "doctype": "Report", "idx": 3, "is_standard": "Yes", - "modified": "2017-02-24 20:02:41.910358", + "modified": "2017-11-10 19:42:43.376658", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "Student Monthly Attendance Sheet", "owner": "Administrator", "ref_doctype": "Student Attendance", diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py similarity index 98% rename from erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py rename to erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py index d869cec01df..0c7baa848fa 100644 --- a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py +++ b/erpnext/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py @@ -6,7 +6,7 @@ import frappe from frappe.utils import cstr, cint, getdate, get_first_day, get_last_day, date_diff, add_days from frappe import msgprint, _ from calendar import monthrange -from erpnext.schools.api import get_student_group_students +from erpnext.education.api import get_student_group_students def execute(filters=None): if not filters: filters = {} diff --git a/erpnext/education/setup.py b/erpnext/education/setup.py new file mode 100644 index 00000000000..ed1d69e80de --- /dev/null +++ b/erpnext/education/setup.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals + +import frappe +from erpnext.setup.utils import insert_record + + +def setup_education(): + if frappe.db.exists('Academic Year', '2015-16'): + # already setup + return + create_academic_sessions() + +def create_academic_sessions(): + data = [ + {"doctype": "Academic Year", "academic_year_name": "2015-16"}, + {"doctype": "Academic Year", "academic_year_name": "2016-17"}, + {"doctype": "Academic Year", "academic_year_name": "2017-18"}, + {"doctype": "Academic Year", "academic_year_name": "2018-19"}, + {"doctype": "Academic Term", "academic_year": "2016-17", "term_name": "Semester 1"}, + {"doctype": "Academic Term", "academic_year": "2016-17", "term_name": "Semester 2"}, + {"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 1"}, + {"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 2"} + ] + insert_record(data) diff --git a/erpnext/schools/utils.py b/erpnext/education/utils.py similarity index 100% rename from erpnext/schools/utils.py rename to erpnext/education/utils.py diff --git a/erpnext/schools/web_form/__init__.py b/erpnext/education/web_form/__init__.py similarity index 100% rename from erpnext/schools/web_form/__init__.py rename to erpnext/education/web_form/__init__.py diff --git a/erpnext/schools/web_form/discussion/__init__.py b/erpnext/education/web_form/student_applicant/__init__.py similarity index 100% rename from erpnext/schools/web_form/discussion/__init__.py rename to erpnext/education/web_form/student_applicant/__init__.py diff --git a/erpnext/schools/web_form/student_applicant/student_applicant.js b/erpnext/education/web_form/student_applicant/student_applicant.js similarity index 100% rename from erpnext/schools/web_form/student_applicant/student_applicant.js rename to erpnext/education/web_form/student_applicant/student_applicant.js diff --git a/erpnext/schools/web_form/student_applicant/student_applicant.json b/erpnext/education/web_form/student_applicant/student_applicant.json similarity index 98% rename from erpnext/schools/web_form/student_applicant/student_applicant.json rename to erpnext/education/web_form/student_applicant/student_applicant.json index f87a147dde1..b1ad754c327 100644 --- a/erpnext/schools/web_form/student_applicant/student_applicant.json +++ b/erpnext/education/web_form/student_applicant/student_applicant.json @@ -16,9 +16,9 @@ "is_standard": 1, "login_required": 1, "max_attachment_size": 0, - "modified": "2017-02-21 04:44:46.022738", + "modified": "2017-02-21 05:44:46.022738", "modified_by": "Administrator", - "module": "Schools", + "module": "Education", "name": "student-applicant", "owner": "Administrator", "payment_button_label": "Buy Now", diff --git a/erpnext/schools/web_form/student_applicant/student_applicant.py b/erpnext/education/web_form/student_applicant/student_applicant.py similarity index 100% rename from erpnext/schools/web_form/student_applicant/student_applicant.py rename to erpnext/education/web_form/student_applicant/student_applicant.py diff --git a/erpnext/healthcare/setup.py b/erpnext/healthcare/setup.py index 69a92b348ba..fca12704891 100644 --- a/erpnext/healthcare/setup.py +++ b/erpnext/healthcare/setup.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import frappe from frappe import _ +from erpnext.setup.utils import insert_record def setup_healthcare(): if frappe.db.exists('Medical Department', 'Cardiology'): @@ -259,17 +260,3 @@ def create_sensitivity(): {"doctype": "Sensitivity", "sensitivity": _("Intermediate")} ] insert_record(records) - -def insert_record(records): - for r in records: - doc = frappe.new_doc(r.get("doctype")) - doc.update(r) - try: - doc.insert(ignore_permissions=True) - except frappe.DuplicateEntryError, e: - # pass DuplicateEntryError and continue - if e.args and e.args[0]==doc.doctype and e.args[1]==doc.name: - # make sure DuplicateEntryError is for the exact same doc and not a related doc - pass - else: - raise diff --git a/erpnext/modules.txt b/erpnext/modules.txt index 79ded14573f..e918198d65e 100644 --- a/erpnext/modules.txt +++ b/erpnext/modules.txt @@ -13,7 +13,7 @@ Shopping Cart Hub Node Portal Maintenance -Schools +Education Regional Healthcare Restaurant diff --git a/erpnext/patches.txt b/erpnext/patches.txt index fa1990f9cc3..b7a40993e72 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -468,4 +468,5 @@ erpnext.patches.v9_2.delete_healthcare_domain_default_items erpnext.patches.v9_1.create_issue_opportunity_type erpnext.patches.v9_2.rename_translated_domains_in_en erpnext.patches.v9_0.set_shipping_type_for_existing_shipping_rules -erpnext.patches.v9_0.update_multi_uom_fields_in_material_request \ No newline at end of file +erpnext.patches.v9_0.update_multi_uom_fields_in_material_request +erpnext.patches.v10_0.rename_schools_to_education diff --git a/erpnext/schools/web_form/student_applicant/__init__.py b/erpnext/patches/v10_0/__init__.py similarity index 100% rename from erpnext/schools/web_form/student_applicant/__init__.py rename to erpnext/patches/v10_0/__init__.py diff --git a/erpnext/patches/v10_0/rename_schools_to_education.py b/erpnext/patches/v10_0/rename_schools_to_education.py new file mode 100644 index 00000000000..85c25a89434 --- /dev/null +++ b/erpnext/patches/v10_0/rename_schools_to_education.py @@ -0,0 +1,32 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + # rename the School module as Education + + # rename the school module + if frappe.db.exists('Module Def', 'Schools') and not frappe.db.exists('Module Def', 'Education'): + frappe.rename_doc("Module Def", "Schools", "Education") + + # delete the school module + if frappe.db.exists('Module Def', 'Schools') and frappe.db.exists('Module Def', 'Education'): + frappe.db.sql("""delete from `tabModule Def` where module_name = 'Schools'""") + + + # rename "School Settings" to the "Education Settings + if frappe.db.exists('DocType', 'School Settings'): + frappe.rename_doc("DocType", "School Settings", "Education Settings", force=True) + frappe.reload_doc("education", "doctype", "education_settings") + + # delete the discussion web form if exists + if frappe.db.exists('Web Form', 'Discussion'): + frappe.db.sql("""delete from `tabWeb Form` where name = 'discussion'""") + + # rename the select option field from "School Bus" to "Institute's Bus" + frappe.reload_doc("education", "doctype", "Program Enrollment") + if "mode_of_transportation" in frappe.db.get_table_columns("Program Enrollment"): + frappe.db.sql("""update `tabProgram Enrollment` set mode_of_transportation = "Institute's Bus" + where mode_of_transportation = "School Bus" """) diff --git a/erpnext/patches/v7_0/make_guardian.py b/erpnext/patches/v7_0/make_guardian.py index 0839c4f6244..519969b38d1 100644 --- a/erpnext/patches/v7_0/make_guardian.py +++ b/erpnext/patches/v7_0/make_guardian.py @@ -5,9 +5,15 @@ def execute(): if frappe.db.exists("DocType", "Student"): student_table_cols = frappe.db.get_table_columns("Student") if "father_name" in student_table_cols: - frappe.reload_doc("schools", "doctype", "student") - frappe.reload_doc("schools", "doctype", "guardian") - frappe.reload_doc("schools", "doctype", "guardian_interest") + + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", "student") + # frappe.reload_doc("schools", "doctype", "guardian") + # frappe.reload_doc("schools", "doctype", "guardian_interest") + + frappe.reload_doc("education", "doctype", "student") + frappe.reload_doc("education", "doctype", "guardian") + frappe.reload_doc("education", "doctype", "guardian_interest") frappe.reload_doc("hr", "doctype", "interest") fields = ["name", "father_name", "mother_name"] diff --git a/erpnext/patches/v7_0/migrate_schools_to_erpnext.py b/erpnext/patches/v7_0/migrate_schools_to_erpnext.py index f64f400feb5..9137b5aa92d 100644 --- a/erpnext/patches/v7_0/migrate_schools_to_erpnext.py +++ b/erpnext/patches/v7_0/migrate_schools_to_erpnext.py @@ -13,13 +13,20 @@ def execute(): frappe.db.sql("""delete from `tabDesktop Icon`""") if not frappe.db.exists('Module Def', 'Schools') and frappe.db.exists('Module Def', 'Academics'): - frappe.rename_doc("Module Def", "Academics", "Schools") + + # 'Schools' module changed to the 'Education' + # frappe.rename_doc("Module Def", "Academics", "Schools") + + frappe.rename_doc("Module Def", "Academics", "Education") remove_from_installed_apps("schools") def reload_doctypes_for_schools_icons(): - base_path = frappe.get_app_path('erpnext', 'schools', 'doctype') + # 'Schools' module changed to the 'Education' + # base_path = frappe.get_app_path('erpnext', 'schools', 'doctype') + + base_path = frappe.get_app_path('erpnext', 'education', 'doctype') for doctype in os.listdir(base_path): if os.path.exists(os.path.join(base_path, doctype, doctype + '.json')) \ and doctype not in ("fee_component", "assessment", "assessment_result"): - frappe.reload_doc('schools', 'doctype', doctype) \ No newline at end of file + frappe.reload_doc('education', 'doctype', doctype) \ No newline at end of file diff --git a/erpnext/patches/v7_0/rename_examination_to_assessment.py b/erpnext/patches/v7_0/rename_examination_to_assessment.py index 1d6e6882826..dc248de4fae 100644 --- a/erpnext/patches/v7_0/rename_examination_to_assessment.py +++ b/erpnext/patches/v7_0/rename_examination_to_assessment.py @@ -10,8 +10,14 @@ def execute(): if frappe.db.exists("DocType", "Examination"): frappe.rename_doc("DocType", "Examination", "Assessment") frappe.rename_doc("DocType", "Examination Result", "Assessment Result") - frappe.reload_doc("schools", "doctype", "assessment") - frappe.reload_doc("schools", "doctype", "assessment_result") + + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", "assessment") + # frappe.reload_doc("schools", "doctype", "assessment_result") + + frappe.reload_doc("education", "doctype", "assessment") + frappe.reload_doc("education", "doctype", "assessment_result") + rename_field("Assessment", "exam_name", "assessment_name") rename_field("Assessment", "exam_code", "assessment_code") diff --git a/erpnext/patches/v7_0/set_portal_settings.py b/erpnext/patches/v7_0/set_portal_settings.py index 9bae1c54c03..5259d4fbd44 100644 --- a/erpnext/patches/v7_0/set_portal_settings.py +++ b/erpnext/patches/v7_0/set_portal_settings.py @@ -8,7 +8,9 @@ import frappe def execute(): frappe.reload_doctype('Role') for dt in ("assessment", "course", "fees"): - frappe.reload_doc("schools", "doctype", dt) + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", dt) + frappe.reload_doc("education", "doctype", dt) for dt in ("domain", "has_domain", "domain_settings"): frappe.reload_doc("core", "doctype", dt) diff --git a/erpnext/patches/v7_1/set_student_guardian.py b/erpnext/patches/v7_1/set_student_guardian.py index e64279b8a82..0942505b568 100644 --- a/erpnext/patches/v7_1/set_student_guardian.py +++ b/erpnext/patches/v7_1/set_student_guardian.py @@ -2,9 +2,15 @@ import frappe def execute(): if frappe.db.exists("DocType", "Guardian"): - frappe.reload_doc("schools", "doctype", "student") - frappe.reload_doc("schools", "doctype", "student_guardian") - frappe.reload_doc("schools", "doctype", "student_sibling") + + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", "student") + # frappe.reload_doc("schools", "doctype", "student_guardian") + # frappe.reload_doc("schools", "doctype", "student_sibling") + + frappe.reload_doc("education", "doctype", "student") + frappe.reload_doc("education", "doctype", "student_guardian") + frappe.reload_doc("education", "doctype", "student_sibling") if "student" not in frappe.db.get_table_columns("Guardian"): return guardian = frappe.get_all("Guardian", fields=["name", "student"]) diff --git a/erpnext/patches/v7_2/mark_students_active.py b/erpnext/patches/v7_2/mark_students_active.py index 3513cdeb344..0a2f2d3c105 100644 --- a/erpnext/patches/v7_2/mark_students_active.py +++ b/erpnext/patches/v7_2/mark_students_active.py @@ -1,5 +1,8 @@ import frappe def execute(): - frappe.reload_doc('schools', 'doctype', 'student_group_student') - frappe.db.sql("update `tabStudent Group Student` set active=1") + # 'Schools' module changed to the 'Education' + # frappe.reload_doc('schools', 'doctype', 'student_group_student') + + frappe.reload_doc('education', 'doctype', 'student_group_student') + frappe.db.sql("update `tabStudent Group Student` set active=1") diff --git a/erpnext/patches/v7_2/rename_evaluation_criteria.py b/erpnext/patches/v7_2/rename_evaluation_criteria.py index a45604fd812..d74976084be 100644 --- a/erpnext/patches/v7_2/rename_evaluation_criteria.py +++ b/erpnext/patches/v7_2/rename_evaluation_criteria.py @@ -2,28 +2,37 @@ import frappe from frappe.model.utils.rename_field import rename_field def execute(): + # 'Schools' module changed to the 'Education' + + frappe.rename_doc("DocType", "Evaluation Criteria", "Assessment Criteria", force=True) - frappe.reload_doc("schools", "doctype", "assessment_criteria") + # frappe.reload_doc("schools", "doctype", "assessment_criteria") + frappe.reload_doc("education", "doctype", "assessment_criteria") if 'evaluation_criteria' in frappe.db.get_table_columns('Assessment Criteria'): rename_field("Assessment Criteria", "evaluation_criteria", "assessment_criteria") frappe.rename_doc("DocType", "Assessment Evaluation Criteria", "Assessment Plan Criteria", force=True) - frappe.reload_doc("schools", "doctype", "assessment_plan_criteria") + # frappe.reload_doc("schools", "doctype", "assessment_plan_criteria") + frappe.reload_doc("education", "doctype", "assessment_plan_criteria") if 'evaluation_criteria' in frappe.db.get_table_columns('Assessment Plan'): rename_field("Assessment Plan Criteria", "evaluation_criteria", "assessment_criteria") - frappe.reload_doc("schools", "doctype", "assessment_plan") + # frappe.reload_doc("schools", "doctype", "assessment_plan") + frappe.reload_doc("education", "doctype", "assessment_plan") rename_field("Assessment Plan", "evaluation_criterias", "assessment_criteria") - frappe.reload_doc("schools", "doctype", "assessment_result_detail") + # frappe.reload_doc("schools", "doctype", "assessment_result_detail") + frappe.reload_doc("education", "doctype", "assessment_result_detail") if 'evaluation_criteria' in frappe.db.get_table_columns('Assessment Result Detail'): rename_field("Assessment Result Detail", "evaluation_criteria", "assessment_criteria") frappe.rename_doc("DocType", "Course Evaluation Criteria", "Course Assessment Criteria", force=True) - frappe.reload_doc("schools", "doctype", "course_assessment_criteria") + # frappe.reload_doc("schools", "doctype", "course_assessment_criteria") + frappe.reload_doc("education", "doctype", "course_assessment_criteria") if 'evaluation_criteria' in frappe.db.get_table_columns('Course Assessment Criteria'): rename_field("Course Assessment Criteria", "evaluation_criteria", "assessment_criteria") - frappe.reload_doc("schools", "doctype", "course") + # frappe.reload_doc("schools", "doctype", "course") + frappe.reload_doc("education", "doctype", "course") if 'evaluation_criteria' in frappe.db.get_table_columns('Course'): rename_field("Course", "evaluation_criterias", "assessment_criteria") diff --git a/erpnext/patches/v7_2/update_assessment_modules.py b/erpnext/patches/v7_2/update_assessment_modules.py index 9075bbf87db..37ae7c77f84 100644 --- a/erpnext/patches/v7_2/update_assessment_modules.py +++ b/erpnext/patches/v7_2/update_assessment_modules.py @@ -8,21 +8,28 @@ def execute(): 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") + # frappe.reload_doc("schools", "doctype", "grading_scale_interval") + frappe.reload_doc("education", "doctype", "grading_scale_interval") if "to_score" in frappe.db.get_table_columns("Grading Scale Interval"): rename_field("Grading Scale Interval", "to_score", "threshold") if not frappe.db.exists("DocType", "Assessment Plan"): frappe.rename_doc("DocType", "Assessment", "Assessment Plan", force=True) + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", "assessment_plan") + #Rename Assessment Results - frappe.reload_doc("schools", "doctype", "assessment_plan") + frappe.reload_doc("education", "doctype", "assessment_plan") 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") - frappe.reload_doc("schools", "doctype", "assessment_criteria") + # frappe.reload_doc("schools", "doctype", "assessment_result") + # frappe.reload_doc("schools", "doctype", "assessment_result_detail") + # frappe.reload_doc("schools", "doctype", "assessment_criteria") + frappe.reload_doc("education", "doctype", "assessment_result") + frappe.reload_doc("education", "doctype", "assessment_result_detail") + frappe.reload_doc("education", "doctype", "assessment_criteria") for assessment in frappe.get_all("Assessment Plan", diff --git a/erpnext/patches/v7_2/update_guardian_name_in_student_master.py b/erpnext/patches/v7_2/update_guardian_name_in_student_master.py index 6ac40736375..163e7c3d19b 100644 --- a/erpnext/patches/v7_2/update_guardian_name_in_student_master.py +++ b/erpnext/patches/v7_2/update_guardian_name_in_student_master.py @@ -2,8 +2,12 @@ import frappe from frappe.model.utils.rename_field import rename_field def execute(): - frappe.reload_doc("schools", "doctype", "student_guardian") - student_guardians = frappe.get_all("Student Guardian", fields=["guardian"]) - for student_guardian in student_guardians: - guardian_name = frappe.db.get_value("Guardian", student_guardian.guardian, "guardian_name") - frappe.db.sql("update `tabStudent Guardian` set guardian_name = %s where guardian= %s", (guardian_name, student_guardian.guardian)) \ No newline at end of file + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", "student_guardian") + frappe.reload_doc("education", "doctype", "student_guardian") + + student_guardians = frappe.get_all("Student Guardian", fields=["guardian"]) + for student_guardian in student_guardians: + guardian_name = frappe.db.get_value("Guardian", student_guardian.guardian, "guardian_name") + frappe.db.sql("update `tabStudent Guardian` set guardian_name = %s where guardian= %s", + (guardian_name, student_guardian.guardian)) \ No newline at end of file diff --git a/erpnext/patches/v8_0/merge_student_batch_and_student_group.py b/erpnext/patches/v8_0/merge_student_batch_and_student_group.py index ca71d36d090..fb9021fd687 100644 --- a/erpnext/patches/v8_0/merge_student_batch_and_student_group.py +++ b/erpnext/patches/v8_0/merge_student_batch_and_student_group.py @@ -11,7 +11,10 @@ def execute(): # for converting student batch into student group for doctype in ["Student Group", "Student Group Student", 'Program Enrollment', "Student Group Instructor", "Student Attendance", "Student", "Student Batch Name"]: - frappe.reload_doc("schools", "doctype", frappe.scrub(doctype)) + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", frappe.scrub(doctype)) + + frappe.reload_doc("education", "doctype", frappe.scrub(doctype)) if frappe.db.table_exists("Student Batch"): student_batches = frappe.db.sql('''select name as student_group_name, student_batch_name as batch, diff --git a/erpnext/patches/v9_0/copy_old_fees_field_data.py b/erpnext/patches/v9_0/copy_old_fees_field_data.py index 4243c5bb62e..14278209c75 100644 --- a/erpnext/patches/v9_0/copy_old_fees_field_data.py +++ b/erpnext/patches/v9_0/copy_old_fees_field_data.py @@ -5,7 +5,9 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doc("schools", "doctype", "fees") + # 'Schools' module changed to the 'Education' + # frappe.reload_doc("schools", "doctype", "fees") + frappe.reload_doc("education", "doctype", "fees") if "total_amount" not in frappe.db.get_table_columns("Fees"): return diff --git a/erpnext/patches/v9_0/student_admission_childtable_migrate.py b/erpnext/patches/v9_0/student_admission_childtable_migrate.py index 76b946d6375..a5712c76dcc 100644 --- a/erpnext/patches/v9_0/student_admission_childtable_migrate.py +++ b/erpnext/patches/v9_0/student_admission_childtable_migrate.py @@ -5,8 +5,11 @@ from __future__ import unicode_literals import frappe def execute(): - frappe.reload_doc('schools', 'doctype', 'student_admission_program') - frappe.reload_doc('schools', 'doctype', 'student_admission') + # 'Schools' module changed to the 'Education' + # frappe.reload_doc('schools', 'doctype', 'Student Admission Program') + # frappe.reload_doc('schools', 'doctype', 'student_admission') + frappe.reload_doc('education', 'doctype', 'Student Admission Program') + frappe.reload_doc('education', 'doctype', 'student_admission') if "program" not in frappe.db.get_table_columns("Student Admission"): return diff --git a/erpnext/public/build.json b/erpnext/public/build.json index 0730df96b2b..0bcbf710320 100644 --- a/erpnext/public/build.json +++ b/erpnext/public/build.json @@ -31,10 +31,10 @@ "public/js/templates/item_selector.html", "public/js/utils/item_selector.js", "public/js/help_links.js", - "public/js/schools/student_button.html", - "public/js/schools/assessment_result_tool.html", "public/js/templates/item_quick_entry.html", - "public/js/utils/item_quick_entry.js" + "public/js/utils/item_quick_entry.js", + "public/js/education/student_button.html", + "public/js/education/assessment_result_tool.html" ], "js/item-dashboard.min.js": [ "stock/dashboard/item_dashboard.html", diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js index 7c274f18db2..53b71086720 100644 --- a/erpnext/public/js/setup_wizard.js +++ b/erpnext/public/js/setup_wizard.js @@ -25,7 +25,7 @@ erpnext.setup.slides_settings = [ { "label": __("Manufacturing"), "value": "Manufacturing" }, { "label": __("Retail"), "value": "Retail" }, { "label": __("Services"), "value": "Services" }, - { "label": __("Education (beta)"), "value": "Education" }, + { "label": __("Education"), "value": "Education" }, {"label": __("Healthcare (beta)"), "value": "Healthcare"} ], reqd: 1 }, diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.json b/erpnext/schools/doctype/student_leave_application/student_leave_application.json deleted file mode 100644 index a081e14ae27..00000000000 --- a/erpnext/schools/doctype/student_leave_application/student_leave_application.json +++ /dev/null @@ -1,357 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "SLA.######", - "beta": 0, - "creation": "2016-11-28 15:38:54.793854", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "student", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Student", - "length": 0, - "no_copy": 0, - "options": "Student", - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "student_name", - "fieldtype": "Read Only", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Student Name", - "length": 0, - "no_copy": 0, - "options": "student.title", - "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, - "fieldname": "column_break_3", - "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, - "label": "", - "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, - "fieldname": "from_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "From Date", - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "to_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "To Date", - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Will show the student as Present in Student Monthly Attendance Report", - "fieldname": "mark_as_present", - "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": "Mark as Present", - "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, - "fieldname": "section_break_5", - "fieldtype": "Section 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, - "fieldname": "reason", - "fieldtype": "Text", - "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": "Reason", - "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, - "fieldname": "amended_from", - "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": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Student Leave Application", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 1, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-07-17 21:57:57.804413", - "modified_by": "Administrator", - "module": "Schools", - "name": "Student Leave Application", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Instructor", - "set_user_permissions": 0, - "share": 0, - "submit": 1, - "write": 1 - }, - { - "amend": 1, - "apply_user_permissions": 0, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Academics User", - "set_user_permissions": 0, - "share": 1, - "submit": 1, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "restrict_to_domain": "Education", - "show_name_in_global_search": 1, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "student_name", - "track_changes": 0, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/schools/doctype/student_log/student_log.json b/erpnext/schools/doctype/student_log/student_log.json deleted file mode 100644 index 81d702687a9..00000000000 --- a/erpnext/schools/doctype/student_log/student_log.json +++ /dev/null @@ -1,400 +0,0 @@ -{ - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "SLog.####", - "beta": 0, - "creation": "2016-07-29 03:27:22.451772", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "student", - "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": 1, - "label": "Student", - "length": 0, - "no_copy": 0, - "options": "Student", - "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_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "student_name", - "fieldtype": "Read Only", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Student Name", - "length": 0, - "no_copy": 0, - "options": "student.title", - "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, - "fieldname": "type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Type", - "length": 0, - "no_copy": 0, - "options": "General\nAcademic\nMedical\nAchievement", - "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, - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Date", - "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, - "fieldname": "column_break_3", - "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, - "fieldname": "academic_year", - "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": "Academic Year", - "length": 0, - "no_copy": 0, - "options": "Academic Year", - "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, - "fieldname": "academic_term", - "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": "Academic Term", - "length": 0, - "no_copy": 0, - "options": "Academic Term", - "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, - "fieldname": "program", - "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": "Program", - "length": 0, - "no_copy": 0, - "options": "Program", - "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, - "fieldname": "student_batch", - "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": "Student Batch", - "length": 0, - "no_copy": 0, - "options": "Student Batch Name", - "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, - "fieldname": "section_break_5", - "fieldtype": "Section 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, - "fieldname": "log", - "fieldtype": "Text Editor", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Log", - "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 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-07-17 21:57:11.024049", - "modified_by": "Administrator", - "module": "Schools", - "name": "Student Log", - "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, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Academics User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "restrict_to_domain": "Education", - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "title_field": "student_name", - "track_changes": 0, - "track_seen": 1 -} \ No newline at end of file diff --git a/erpnext/schools/web_form/discussion/discussion.js b/erpnext/schools/web_form/discussion/discussion.js deleted file mode 100644 index 4130b0c4bdb..00000000000 --- a/erpnext/schools/web_form/discussion/discussion.js +++ /dev/null @@ -1,4 +0,0 @@ -frappe.ready(function() { - var form = $('form[data-web-form="discussion"]'), - owner = form.attr('data-owner'); -}) \ No newline at end of file diff --git a/erpnext/schools/web_form/discussion/discussion.json b/erpnext/schools/web_form/discussion/discussion.json deleted file mode 100644 index 4a781d19d8c..00000000000 --- a/erpnext/schools/web_form/discussion/discussion.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "allow_comments": 1, - "allow_delete": 1, - "allow_edit": 1, - "allow_multiple": 1, - "creation": "2016-06-26 20:46:09.598755", - "doc_type": "Discussion", - "docstatus": 0, - "doctype": "Web Form", - "idx": 0, - "is_standard": 1, - "login_required": 1, - "modified": "2016-07-19 07:55:37.826664", - "modified_by": "Administrator", - "module": "Schools", - "name": "discussion", - "owner": "Administrator", - "published": 1, - "route": "discussion", - "success_url": "", - "title": "Discussion", - "web_form_fields": [ - { - "fieldname": "course", - "fieldtype": "Data", - "hidden": 0, - "label": "Course", - "options": "Course", - "read_only": 1, - "reqd": 0 - }, - { - "fieldname": "subject", - "fieldtype": "Text", - "hidden": 0, - "label": "Subject", - "read_only": 0, - "reqd": 1 - }, - { - "fieldname": "description", - "fieldtype": "Text", - "hidden": 0, - "label": "Description", - "read_only": 0, - "reqd": 0 - } - ] -} \ No newline at end of file diff --git a/erpnext/schools/web_form/discussion/discussion.py b/erpnext/schools/web_form/discussion/discussion.py deleted file mode 100644 index 23ff05272f5..00000000000 --- a/erpnext/schools/web_form/discussion/discussion.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import unicode_literals - -import frappe - -def get_context(context=None): - pass - -def has_website_permission(doc, ptype, user, verbose=False): - return True \ No newline at end of file diff --git a/erpnext/setup/setup_wizard/sample_data.py b/erpnext/setup/setup_wizard/sample_data.py index e58b5f2e0c5..5a2fbd3ac58 100644 --- a/erpnext/setup/setup_wizard/sample_data.py +++ b/erpnext/setup/setup_wizard/sample_data.py @@ -107,16 +107,16 @@ def make_projects(domain): if domain == 'Education': tasks += [ { - "title": _("Setup your School in ERPNext"), + "title": _("Setup your Institute in ERPNext"), "start_date": current_date, "end_date": frappe.utils.add_days(current_date, 1), - "file": "school_masters.md" + "file": "education_masters.md" }, { "title": "Setup Master Data", "start_date": current_date, "end_date": frappe.utils.add_days(current_date, 1), - "file": "school_masters.md" + "file": "education_masters.md" }] else: diff --git a/erpnext/setup/setup_wizard/tasks/school_masters.md b/erpnext/setup/setup_wizard/tasks/education_masters.md similarity index 75% rename from erpnext/setup/setup_wizard/tasks/school_masters.md rename to erpnext/setup/setup_wizard/tasks/education_masters.md index 91039352b02..d0887d2d74d 100644 --- a/erpnext/setup/setup_wizard/tasks/school_masters.md +++ b/erpnext/setup/setup_wizard/tasks/education_masters.md @@ -6,4 +6,4 @@ Lets start making things in ERPNext that are representative of your institution. 1. Start adding **Students** 1. Group your students into **Batches** -Watch this video to learn more about ERPNext Schools: https://www.youtube.com/watch?v=f6foQOyGzdA +Watch this video to learn more about ERPNext Education: https://www.youtube.com/watch?v=f6foQOyGzdA diff --git a/erpnext/setup/setup_wizard/tasks/school_import_data.md b/erpnext/setup/setup_wizard/tasks/school_import_data.md index c465b812c8b..1fbe04906ef 100644 --- a/erpnext/setup/setup_wizard/tasks/school_import_data.md +++ b/erpnext/setup/setup_wizard/tasks/school_import_data.md @@ -1,5 +1,5 @@ Lets import some data! 💪💪 -If you are already running a school, you most likely have your Students in some spreadsheet file somewhere. Import it into ERPNext with the Data Import Tool. +If you are already running a Institute, you most likely have your Students in some spreadsheet file somewhere. Import it into ERPNext with the Data Import Tool. Watch this video to get started: https://www.youtube.com/watch?v=Ta2Xx3QoK3E \ No newline at end of file diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index d77ebd16995..ffb3aa6926b 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -120,3 +120,18 @@ def enable_all_roles_and_domains(): frappe.get_single('Domain Settings').set_active_domains(\ [d.name for d in domains]) add_all_roles_to('Administrator') + + +def insert_record(records): + for r in records: + doc = frappe.new_doc(r.get("doctype")) + doc.update(r) + try: + doc.insert(ignore_permissions=True) + except frappe.DuplicateEntryError, e: + # pass DuplicateEntryError and continue + if e.args and e.args[0]==doc.doctype and e.args[1]==doc.name: + # make sure DuplicateEntryError is for the exact same doc and not a related doc + pass + else: + raise diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index 0bbffa5666f..edf1d78ffbd 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -42,13 +42,13 @@ erpnext/hr/doctype/leave_type/test_leave_type.js erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.js erpnext/hr/doctype/leave_allocation/test_leave_allocation.js erpnext/hr/doctype/leave_application/test_leave_application.js -erpnext/schools/doctype/academic_year/test_academic_year.js -erpnext/schools/doctype/academic_term/test_academic_term.js -erpnext/schools/doctype/school_settings/test_school_settings.js -erpnext/schools/doctype/student_batch_name/test_student_batch_name.js -erpnext/schools/doctype/student_category/test_student_category.js -erpnext/schools/doctype/room/test_room.js -erpnext/schools/doctype/instructor/test_instructor.js +erpnext/education/doctype/academic_year/test_academic_year.js +erpnext/education/doctype/academic_term/test_academic_term.js +erpnext/education/doctype/education_settings/test_education_settings.js +erpnext/education/doctype/student_batch_name/test_student_batch_name.js +erpnext/education/doctype/student_category/test_student_category.js +erpnext/education/doctype/room/test_room.js +erpnext/education/doctype/instructor/test_instructor.js erpnext/stock/doctype/warehouse/test_warehouse.js erpnext/manufacturing/doctype/production_order/test_production_order.js #long erpnext/accounts/page/pos/test_pos.js @@ -96,26 +96,26 @@ erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_item_wise_d erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_taxes_and_charges.js erpnext/buying/doctype/purchase_order/tests/test_purchase_order_receipt.js erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.js -erpnext/schools/doctype/grading_scale/test_grading_scale.js -erpnext/schools/doctype/assessment_criteria_group/test_assessment_criteria_group.js -erpnext/schools/doctype/assessment_criteria/test_assessment_criteria.js -erpnext/schools/doctype/course/test_course.js -erpnext/schools/doctype/program/test_program.js -erpnext/schools/doctype/guardian/test_guardian.js -erpnext/schools/doctype/student_admission/test_student_admission.js -erpnext/schools/doctype/student_applicant/tests/test_student_applicant_dummy_data.js -erpnext/schools/doctype/student_applicant/tests/test_student_applicant.js -erpnext/schools/doctype/student_applicant/tests/test_student_applicant_options.js -erpnext/schools/doctype/student_log/test_student_log.js -erpnext/schools/doctype/student_group/test_student_group.js -erpnext/schools/doctype/student_group_creation_tool/test_student_group_creation_tool.js -erpnext/schools/doctype/student_leave_application/test_student_leave_application.js -erpnext/schools/doctype/student_attendance_tool/test_student_attendance_tool.js -erpnext/schools/doctype/student_attendance/test_student_attendance.js -erpnext/schools/doctype/assessment_group/test_assessment_group.js -erpnext/schools/doctype/assessment_plan/test_assessment_plan.js -erpnext/schools/doctype/assessment_result/test_assessment_result.js -erpnext/schools/doctype/assessment_result_tool/test_assessment_result_tool.js +erpnext/education/doctype/grading_scale/test_grading_scale.js +erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js +erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js +erpnext/education/doctype/course/test_course.js +erpnext/education/doctype/program/test_program.js +erpnext/education/doctype/guardian/test_guardian.js +erpnext/education/doctype/student_admission/test_student_admission.js +erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js +erpnext/education/doctype/student_applicant/tests/test_student_applicant.js +erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js +erpnext/education/doctype/student_log/test_student_log.js +erpnext/education/doctype/student_group/test_student_group.js +erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js +erpnext/education/doctype/student_leave_application/test_student_leave_application.js +erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js +erpnext/education/doctype/student_attendance/test_student_attendance.js +erpnext/education/doctype/assessment_group/test_assessment_group.js +erpnext/education/doctype/assessment_plan/test_assessment_plan.js +erpnext/education/doctype/assessment_result/test_assessment_result.js +erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js erpnext/accounts/doctype/journal_entry/test_journal_entry.js erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.js erpnext/accounts/doctype/payment_entry/tests/test_payment_entry.js diff --git a/erpnext/utilities/user_progress.py b/erpnext/utilities/user_progress.py index 250951159a3..685624e030f 100644 --- a/erpnext/utilities/user_progress.py +++ b/erpnext/utilities/user_progress.py @@ -140,7 +140,7 @@ def get_slide_settings(): ] ), - # School slides begin + # Education slides begin frappe._dict( action_name='Add Programs', domains=("Education"), @@ -219,7 +219,7 @@ def get_slide_settings(): done_state_title_route=["List", "Room"], help_links=[] ), - # School slides end + # Education slides end frappe._dict( action_name='Add Users', diff --git a/erpnext/utilities/user_progress_utils.py b/erpnext/utilities/user_progress_utils.py index 709da574c2b..1af5364d101 100644 --- a/erpnext/utilities/user_progress_utils.py +++ b/erpnext/utilities/user_progress_utils.py @@ -117,7 +117,7 @@ def make_item_price(item, price_list_name, item_price): "price_list_rate": item_price }).insert() -# Schools +# Education @frappe.whitelist() def create_program(args_data): args = json.loads(args_data) diff --git a/license.txt b/license.txt index 2a99aeee332..a238a97b060 100644 --- a/license.txt +++ b/license.txt @@ -663,7 +663,7 @@ program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or -school, if any, to sign a "copyright disclaimer" for the program, if +institute, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see .