diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 36219896865..47f5c73bb17 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -5,7 +5,7 @@ import frappe from erpnext.hooks import regional_overrides from frappe.utils import getdate -__version__ = '10.1.45' +__version__ = '10.1.46' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 14f7891bc1a..7a1a182331e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -21,8 +21,6 @@ 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", cint(frappe.sys_defaults.disable_rounded_total)); } }, diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index ef70110cc44..2b3e824beed 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -170,11 +170,12 @@ class ReceivablePayableReport(object): # ageing data if self.filters.ageing_based_on == "Due Date": - entry_date = due_date + entry_date = due_date elif self.filters.ageing_based_on == "Supplier Invoice Date": - entry_date = bill_date + entry_date = bill_date else: - entry_date = gle.posting_date + entry_date = gle.posting_date + row += get_ageing_data(cint(self.filters.range1), cint(self.filters.range2), cint(self.filters.range3), self.age_as_on, entry_date, outstanding_amount) @@ -186,7 +187,8 @@ class ReceivablePayableReport(object): if self.filters.ageing_based_on == "Supplier Invoice Date" \ and getdate(bill_date) > getdate(self.filters.report_date): - row[-1]=row[-2]=row[-3]=row[-4]=0 + + row[-1]=row[-2]=row[-3]=row[-4]=0 if self.filters.get(scrub(args.get("party_type"))): row.append(gle.account_currency) 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 7df877f38e3..54c0add96f4 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 @@ -223,13 +223,13 @@ def get_tax_accounts(item_list, columns, company_currency, item_tax_amount = flt((tax_amount * d.base_net_amount) / item_net_amount) \ if item_net_amount else 0 if item_tax_amount: - tax_amount = flt(item_tax_amount, tax_amount_precision) - tax_amount = (tax_amount * -1 - if (doctype == 'Purchase Invoice' and name in deducted_tax) else tax_amount) + tax_value = flt(item_tax_amount, tax_amount_precision) + tax_value = (tax_value * -1 + if (doctype == 'Purchase Invoice' and name in deducted_tax) else tax_value) itemised_tax.setdefault(d.name, {})[description] = frappe._dict({ "tax_rate": tax_rate, - "tax_amount": tax_amount + "tax_amount": tax_value }) except ValueError: diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 3c0d44e5e98..61c4dcbec6d 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2672,6 +2672,37 @@ "bold": 0, "collapsible": 0, "columns": 0, + "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": 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": "in_words", "fieldtype": "Data", "hidden": 0, @@ -2705,6 +2736,36 @@ "bold": 0, "collapsible": 0, "columns": 0, + "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": 0, + "columns": 0, "fieldname": "advance_paid", "fieldtype": "Currency", "hidden": 0, @@ -3671,7 +3732,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-07-30 08:35:10.345286", + "modified": "2018-08-01 15:18:33.155409", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index 6576bcfc030..330e2b3a8a0 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -2151,6 +2151,37 @@ "bold": 0, "collapsible": 0, "columns": 0, + "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": 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": "in_words", "fieldtype": "Data", "hidden": 0, @@ -2182,6 +2213,36 @@ "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, + "collapsible": 0, + "columns": 0, + "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": "terms", "columns": 0, @@ -2779,7 +2840,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-07-30 08:36:34.701682", + "modified": "2018-08-01 15:18:23.265621", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 70a07733a7e..7913a766c77 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -115,9 +115,16 @@ class BuyingController(StockController): def set_total_in_words(self): from frappe.utils import money_in_words if self.meta.get_field("base_in_words"): - self.base_in_words = money_in_words(self.base_grand_total, self.company_currency) + amount = (self.base_rounded_total + if not self.get("disable_rounded_total") else self.base_grand_total) + + self.base_in_words = money_in_words(amount, self.company_currency) + if self.meta.get_field("in_words"): - self.in_words = money_in_words(self.grand_total, self.currency) + amount = (self.rounded_total + if not self.get("disable_rounded_total") else self.grand_total) + + self.in_words = money_in_words(amount, self.currency) # update valuation rate def update_valuation_rate(self, parentfield): diff --git a/erpnext/education/doctype/student_group/student_group.py b/erpnext/education/doctype/student_group/student_group.py index d5085894090..465a72d84e0 100644 --- a/erpnext/education/doctype/student_group/student_group.py +++ b/erpnext/education/doctype/student_group/student_group.py @@ -33,7 +33,7 @@ class StudentGroup(Document): program_enrollment = get_program_enrollment(self.academic_year, self.academic_term, self.program, self.batch, self.course) students = [d.student for d in program_enrollment] if program_enrollment else [] for d in self.students: - if not frappe.db.get_value("Student", d.student, "enabled") and d.active: + if not frappe.db.get_value("Student", d.student, "enabled") and d.active and not self.disabled: frappe.throw(_("{0} - {1} is inactive student".format(d.group_roll_number, d.student_name))) if (self.group_based_on == "Batch") and cint(frappe.defaults.get_defaults().validate_batch)\ diff --git a/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py b/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py index d178b0b326f..d76fb29adc9 100644 --- a/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py +++ b/erpnext/healthcare/doctype/lab_test_template/lab_test_template.py @@ -34,7 +34,7 @@ class LabTestTemplate(Document): # remove template refernce from item and disable item if(self.item): try: - frappe.delete_doc("Item",self.item) + frappe.delete_doc("Item",self.item, force=True) except Exception: frappe.throw(_("""Not permitted. Please disable the Test Template""")) diff --git a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py index d535beca569..ad2a9335448 100755 --- a/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +++ b/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py @@ -347,15 +347,16 @@ def get_events(start, end, filters=None): """ from frappe.desk.calendar import get_event_conditions conditions = get_event_conditions("Patient Appointment", filters) - data = frappe.db.sql("""select `tabPatient Appointment`.name, patient, practitioner, status, - duration, timestamp(appointment_date, appointment_time) as 'start', type.color as 'color' - from `tabPatient Appointment` - left join `tabAppointment Type` as type on `tabPatient Appointment`.appointment_type=type.name - where (appointment_date between %(start)s and %(end)s ) - and `tabPatient Appointment`.docstatus < 2 {conditions}""".format(conditions=conditions), + + data = frappe.db.sql("""select name, patient, physician, status, + duration, timestamp(appointment_date, appointment_time) as + 'appointment_date' from `tabPatient Appointment` where + (appointment_date between %(start)s and %(end)s) + and docstatus < 2 {conditions}""".format(conditions=conditions), {"start": start, "end": end}, as_dict=True, update={"allDay": 0}) + for item in data: - item.end = item.start + datetime.timedelta(minutes = item.duration) + item.appointment_datetime = item.appointment_date + datetime.timedelta(minutes = item.duration) return data @frappe.whitelist() diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py index 801a0ef5fa2..e5dfe6f5167 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim.py +++ b/erpnext/hr/doctype/expense_claim/expense_claim.py @@ -26,7 +26,7 @@ class ExpenseClaim(AccountsController): self.validate_sanctioned_amount() self.calculate_total_amount() set_employee_name(self) - self.set_expense_account() + self.set_expense_account(validate=True) self.set_payable_account() self.set_cost_center() self.set_status() @@ -226,9 +226,9 @@ class ExpenseClaim(AccountsController): if flt(d.sanctioned_amount) > flt(d.claim_amount): frappe.throw(_("Sanctioned Amount cannot be greater than Claim Amount in Row {0}.").format(d.idx)) - def set_expense_account(self): + def set_expense_account(self, validate=False): for expense in self.expenses: - if not expense.default_account: + if not expense.default_account or not validate: expense.default_account = get_expense_claim_account(expense.expense_type, self.company)["account"] def update_reimbursed_amount(doc): diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index cf0cede5173..23838040381 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -124,7 +124,7 @@ class Project(Document): "modified": now() }) - task.validate() + task.run_method("validate") task.db_update() else: task.save(ignore_permissions = True) diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index 076b39c1c8f..2822ae850a0 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -26,6 +26,10 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ }; }); + if (this.frm.doc.__islocal) { + this.frm.set_value("disable_rounded_total", cint(frappe.sys_defaults.disable_rounded_total)); + } + /* eslint-disable */ // no idea where me is coming from if(this.frm.get_field('shipping_address')) {