diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 1eee36041f..10f65702ca 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '7.1.10' +__version__ = '7.1.11' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json b/erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json index 968ce298de..437d695166 100644 --- a/erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json +++ b/erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json @@ -31,6 +31,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, @@ -58,6 +59,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, @@ -84,6 +86,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, @@ -109,6 +112,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, @@ -119,7 +123,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "columns": 0, + "columns": 2, "fieldname": "total_amount", "fieldtype": "Float", "hidden": 0, @@ -135,6 +139,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, @@ -145,7 +150,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "columns": 3, + "columns": 2, "fieldname": "outstanding_amount", "fieldtype": "Float", "hidden": 0, @@ -161,6 +166,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, @@ -171,7 +177,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "columns": 3, + "columns": 2, "fieldname": "allocated_amount", "fieldtype": "Float", "hidden": 0, @@ -187,6 +193,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, @@ -213,6 +220,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, @@ -230,7 +238,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-08-26 01:59:04.697274", + "modified": "2016-11-14 12:28:51.822341", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry Reference", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py index d4a82c50e3..6141db5d3c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py @@ -4,7 +4,6 @@ def get_data(): return { 'fieldname': 'purchase_invoice', 'non_standard_fieldnames': { - 'Delivery Note': 'against_sales_invoice', 'Journal Entry': 'reference_name', 'Payment Entry': 'reference_name', 'Payment Request': 'reference_name', @@ -12,8 +11,8 @@ def get_data(): 'Purchase Invoice': 'return_against' }, 'internal_links': { - 'Purchase Order': ['items', 'sales_order'], - 'Purchase Receipt': ['items', 'delivery_note'], + 'Purchase Order': ['items', 'purchase_order'], + 'Purchase Receipt': ['items', 'purchase_receipt'], }, 'transactions': [ { diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index f6e1629454..6d1e1686d1 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -88,6 +88,9 @@ class ReceivablePayableReport(object): future_vouchers = self.get_entries_after(self.filters.report_date, args.get("party_type")) + if not self.filters.get("company"): + self.filters["company"] = frappe.db.get_single_value('Global Defaults', 'default_company') + company_currency = frappe.db.get_value("Company", self.filters.get("company"), "default_currency") data = [] diff --git a/erpnext/crm/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js index 2f1169d790..21fba7b1e7 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.js +++ b/erpnext/crm/doctype/opportunity/opportunity.js @@ -23,20 +23,19 @@ frappe.ui.form.on("Opportunity", { refresh: function(frm) { var doc = frm.doc; frm.events.enquiry_from(frm); - if(doc.status!=="Lost") { if(doc.with_items){ frm.add_custom_button(__('Supplier Quotation'), function() { frm.trigger("make_supplier_quotation") }, __("Make")); - - frm.add_custom_button(__('Quotation'), - cur_frm.cscript.create_quotation, __("Make")); - - frm.page.set_inner_btn_group_as_primary(__("Make")); } + frm.add_custom_button(__('Quotation'), + cur_frm.cscript.create_quotation, __("Make")); + + frm.page.set_inner_btn_group_as_primary(__("Make")); + if(doc.status!=="Quotation") { frm.add_custom_button(__('Lost'), cur_frm.cscript['Declare Opportunity Lost']); @@ -61,9 +60,10 @@ erpnext.crm.Opportunity = frappe.ui.form.Controller.extend({ this.frm.doc.enquiry_from = "Lead"; if(!this.frm.doc.status) - set_multiple(cdt, cdn, { status:'Draft' }); + set_multiple(this.frm.doc.doctype, this.frm.doc.name, { status:'Open' }); if(!this.frm.doc.company && frappe.defaults.get_user_default("Company")) - set_multiple(cdt, cdn, { company:frappe.defaults.get_user_default("Company") }); + set_multiple(this.frm.doc.doctype, this.frm.doc.name, + { company:frappe.defaults.get_user_default("Company") }); this.setup_queries(); }, diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index 8bd3a2346e..6be0768bf4 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -39,6 +39,9 @@ class Opportunity(TransactionBase): if not self.title: self.title = self.customer_name + + if not self.with_items: + self.items = [] def make_new_lead_if_required(self): diff --git a/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json b/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json index 3d2b251e09..47498005c0 100644 --- a/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json +++ b/erpnext/hr/doctype/expense_claim_type/expense_claim_type.json @@ -1,7 +1,7 @@ { "allow_copy": 0, "allow_import": 1, - "allow_rename": 0, + "allow_rename": 1, "autoname": "field:expense_type", "beta": 0, "creation": "2012-03-27 14:35:55", @@ -10,11 +10,13 @@ "doctype": "DocType", "document_type": "Setup", "editable_grid": 0, + "engine": "InnoDB", "fields": [ { "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "expense_type", "fieldtype": "Data", "hidden": 0, @@ -41,6 +43,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "description", "fieldtype": "Small Text", "hidden": 0, @@ -68,6 +71,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "accounts", "fieldtype": "Table", "hidden": 0, @@ -102,7 +106,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-07-18 12:36:10.096252", + "modified": "2016-11-07 11:54:10.936716", "modified_by": "Administrator", "module": "HR", "name": "Expense Claim Type", @@ -118,6 +122,7 @@ "export": 0, "if_owner": 0, "import": 0, + "is_custom": 0, "permlevel": 0, "print": 1, "read": 1, @@ -138,6 +143,7 @@ "export": 0, "if_owner": 0, "import": 0, + "is_custom": 0, "permlevel": 0, "print": 0, "read": 1, diff --git a/erpnext/patches/v7_1/set_prefered_contact_email.py b/erpnext/patches/v7_1/set_prefered_contact_email.py index d662e0dc04..d083811c84 100644 --- a/erpnext/patches/v7_1/set_prefered_contact_email.py +++ b/erpnext/patches/v7_1/set_prefered_contact_email.py @@ -14,6 +14,4 @@ def execute(): employee.prefered_contact_email = "User ID" employee.prefered_email = employee.user_id - employee.flags.ignore_mandatory = True - employee.flags.ignore_validate = True - employee.save() \ No newline at end of file + employee.db_update() \ No newline at end of file diff --git a/erpnext/schools/doctype/student/student_dashboard.py b/erpnext/schools/doctype/student/student_dashboard.py index 6d951680b8..55faffb37b 100644 --- a/erpnext/schools/doctype/student/student_dashboard.py +++ b/erpnext/schools/doctype/student/student_dashboard.py @@ -10,7 +10,7 @@ def get_data(): 'items': ['Student Log', 'Student Group', 'Student Attendance'] }, { - 'items': ['Program Enrollment', 'Fees', 'Assessment', 'Guardian'] + 'items': ['Program Enrollment', 'Fees', 'Assessment'] } ] } \ No newline at end of file diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index 66000cdc97..646aef187e 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -68,7 +68,7 @@ def setup_complete(args=None): frappe.message_log.pop() pass - + def create_fiscal_year_and_company(args): if (args.get('fy_start_date')): curr_fiscal_year = get_fy_details(args.get('fy_start_date'), args.get('fy_end_date')) @@ -244,12 +244,12 @@ def get_fy_details(fy_start_date, fy_end_date): else: fy = cstr(start_year) + '-' + cstr(start_year + 1) return fy - + def create_sales_tax(args): country_wise_tax = get_country_wise_tax(args.get("country")) if country_wise_tax and len(country_wise_tax) > 0: for sales_tax, tax_data in country_wise_tax.items(): - make_tax_account_and_template(args.get("company_name").strip(), + make_tax_account_and_template(args.get("company_name").strip(), tax_data.get('account_name'), tax_data.get('tax_rate'), sales_tax) def get_country_wise_tax(country): @@ -267,7 +267,7 @@ def create_taxes(args): account_name = args.get("tax_" + str(i)) make_tax_account_and_template(args.get("company_name").strip(), account_name, tax_rate) - + def make_tax_account_and_template(company, account_name, tax_rate, template_name=None): try: account = make_tax_account(company, account_name, tax_rate) @@ -280,14 +280,14 @@ def make_tax_account_and_template(company, account_name, tax_rate, template_name raise except RootNotEditable, e: pass - + def get_tax_account_group(company): - tax_group = frappe.db.get_value("Account", + tax_group = frappe.db.get_value("Account", {"account_name": "Duties and Taxes", "is_group": 1, "company": company}) if not tax_group: - tax_group = frappe.db.get_value("Account", {"is_group": 1, "root_type": "Liability", + tax_group = frappe.db.get_value("Account", {"is_group": 1, "root_type": "Liability", "account_type": "Tax", "company": company}) - + return tax_group def make_tax_account(company, account_name, tax_rate): @@ -308,7 +308,7 @@ def make_tax_account(company, account_name, tax_rate): def make_sales_and_purchase_tax_templates(account, template_name=None): if not template_name: template_name = account.name - + sales_tax_template = { "doctype": "Sales Taxes and Charges Template", "title": template_name, @@ -548,35 +548,50 @@ def create_academic_term(): academic_term = frappe.new_doc("Academic Term") academic_term.academic_year = y academic_term.term_name = t - academic_term.save() + try: + academic_term.save() + except frappe.DuplicateEntryError: + pass def create_academic_year(): ac = ["2013-14", "2014-15", "2015-16", "2016-17", "2017-18"] for d in ac: academic_year = frappe.new_doc("Academic Year") academic_year.academic_year_name = d - academic_year.save() + try: + academic_year.save() + except frappe.DuplicateEntryError: + pass def create_program(args): for i in xrange(1,6): if args.get("program_" + str(i)): program = frappe.new_doc("Program") program.program_name = args.get("program_" + str(i)) - program.save() + try: + program.save() + except frappe.DuplicateEntryError: + pass def create_course(args): for i in xrange(1,6): if args.get("course_" + str(i)): course = frappe.new_doc("Course") course.course_name = args.get("course_" + str(i)) - course.save() + try: + course.save() + except frappe.DuplicateEntryError: + pass def create_instructor(args): for i in xrange(1,6): if args.get("instructor_" + str(i)): instructor = frappe.new_doc("Instructor") instructor.instructor_name = args.get("instructor_" + str(i)) - instructor.save() + try: + instructor.save() + except frappe.DuplicateEntryError: + pass def create_room(args): for i in xrange(1,6): @@ -584,6 +599,9 @@ def create_room(args): room = frappe.new_doc("Room") room.room_name = args.get("room_" + str(i)) room.seating_capacity = args.get("room_capacity_" + str(i)) - room.save() + try: + room.save() + except frappe.DuplicateEntryError: + pass diff --git a/erpnext/utilities/doctype/contact/contact.py b/erpnext/utilities/doctype/contact/contact.py index a6878809ef..dd6aa10f95 100644 --- a/erpnext/utilities/doctype/contact/contact.py +++ b/erpnext/utilities/doctype/contact/contact.py @@ -103,4 +103,5 @@ def update_contact(doc, method): for key in ("first_name", "last_name", "phone"): if doc.get(key): contact.set(key, doc.get(key)) + contact.flags.ignore_mandatory = True contact.save(ignore_permissions=True)