[Release Notes] ERPNext and Frappe Version 13.9.0

ERPNext Version 13.9.0 Release Notes

Features & Enhancements

  • Organizational Chart (#26261)
  • Enable discount accounting (#26579)
  • Added multi-select fields in promotional scheme to create multiple pricing rules (#25622)
  • Over transfer allowance for material transfers (#26814)
  • Enhancements in Tax Withholding Category (#26661)

Fixes

  • Sales Return cancellation if linked with Payment Entry (#26883)
  • Production plan not fetching sales order of a variant (#25845)
  • Stock Analytics Report must consider warehouse during calculation (#26908)
  • Incorrect date difference calculation (#26805)
  • Tax calculation for Recurring additional salary (#24206)
  • Cannot cancel payment entry if linked with invoices (#26703)
  • Included company in link document type filters for contact (#26576)
  • Fetch Payment Terms from linked Sales/Purchase Order (#26723)
  • Let all System Managers be able to delete Company transactions (#26819)
  • Bank remittance report issue (#26398)
  • Faulty Gl Entry for Asset LCVs (#26803)
  • Clean Serial No input on Server Side (#26878)
  • Supplier invoice importer fix v13 (#26633)
  • POS payment modes displayed wrong total (#26808)
  • Fetching of item tax from hsn code (#26736)
  • Cannot cancel invoice if IRN cancelled on portal (#26879)
  • Validate python expressions (#26856)
  • POS Item Cart non-stop scroll issue (#26693)
  • Add mandatory depends on condition for export type field (#26958)
  • Cannot generate IRNs for standalone credit notes (#26824)
  • Added progress bar in Repost Item Valuation to check the status of reposting (#26630)
  • TDS calculation for first threshold breach for TDS category 194Q (#26710)
  • Student category mapping from the program enrollment tool (#26739)
  • Cost center & account validation in Sales/Purchase Taxes and Charges (#26881)
  • Reset weight_per_unit on replacing Item (#26791)
  • Do not fetch fully return issued purchase receipts (#26825)
  • Incorrect amount in work order required items table. (#26585)
  • Additional discount calculations in Invoices (#26553)
  • Refactored Asset Repair (#26415)
  • Exchange rate revaluation posting date and precision fixes (#26650)
  • POS Invoice consolidated Sales Invoice field set to no copy (#26768)
  • Consider grand total for threshold check (#26683)
  • Budget variance missing values (#26966)
  • GL Entries for exchange gain loss (#26728)
  • Add missing cess amount in GSTR-3B report (#26544)
  • GST Reports timeout issue (#26575)

Frappe Version 13.9.0 Release Notes

Features & Enhancements

  • New API frappe.ui.Scanner (#13855)
  • PythonExpression and Python option with syntax validation for Code field types (#13707)
  • Internal link support in custom document links (#13823)
  • Promisify frappe.require (#13925)
  • Improvements in Webhooks (#13320)

Fixes

  • Better error message while uploading web image (#13863)
  • Grid rendering performance (#13933)
  • Inbox View & Kanban View not loading (#13788)
  • Add row numbering for report view print format (#13808)
  • Report print option (#13793)
  • Focus reset issue due to field refresh (#13852)
  • Grid header missing when new column added through code (#13805)
  • Ignore RTL conversion for datepicker library styles (#13862)
  • Ability to select email account even if only one account is allowed (#13482)
  • Incorrect depends on evalutation with parent variables (#13593)
  • Check if href exists for a link (#13843)
  • Refactor frappe.translate.get_language (#13902)
  • Activities not rendering correctly (#13833)
  • Request Language Resolution (#13703)
  • Call is_rtl function to get the actual value (#13899)
  • Show command and error message when an exception is raised (#13890)
  • Speed up link validation (#13880)
  • Clicking area around list row checkbox opens doc (#13775)
  • Focus reset issue due to field refresh (#13828)
  • Clicking area around list row checkbox opens doc (#13775)
  • Multiple recorder ui fixes (#13813)
9 Likes

erpnext 13.9.2
frappe 13.9.0

/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/doctype/purchase_invoice_item/purchase_invoice_item.json missing
/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/doctype/sales_invoice_item/sales_invoice_item.json missing
Reposting Stock Ledger Entries…
Traceback (most recent call last):
File “/usr/lib/python3.8/runpy.py”, line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File “/usr/lib/python3.8/runpy.py”, line 87, in _run_code
exec(code, run_globals)
File “/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 104, in
main()
File “/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 19, in main
click.Group(commands=commands)(prog_name=‘bench’)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 829, in call
return self.main(*args, **kwargs)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 782, in main
rv = self.invoke(ctx)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 610, in invoke
return callback(*args, **kwargs)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/decorators.py”, line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/commands/ init .py”, line 27, in _func
ret = f(frappe._dict(ctx.obj), *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/commands/site.py”, line 306, in migrate
migrate(
File “/home/frappe/frappe-bench/apps/frappe/frappe/migrate.py”, line 67, in migrate
frappe.modules.patch_handler.run_all(skip_failing)
File “/home/frappe/frappe-bench/apps/frappe/frappe/modules/patch_handler.py”, line 41, in run_all
run_patch(patch)
File “/home/frappe/frappe-bench/apps/frappe/frappe/modules/patch_handler.py”, line 30, in run_patch
if not run_single(patchmodule = patch):
File “/home/frappe/frappe-bench/apps/frappe/frappe/modules/patch_handler.py”, line 71, in run_single
return execute_patch(patchmodule, method, methodargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/modules/patch_handler.py”, line 91, in execute_patch
frappe.get_attr(patchmodule.split()[0] + “.execute”)()
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/patches/v13_0/item_reposting_for_incorrect_sl_and_gl.py”, line 44, in execute
update_entries_after({
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/stock_ledger.py”, line 247, in init
self.build()
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/stock_ledger.py”, line 292, in build
self.process_sle_against_current_timestamp()
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/stock_ledger.py”, line 316, in process_sle_against_current_timestamp
self.process_sle(sle)
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/stock_ledger.py”, line 436, in process_sle
self.update_outgoing_rate_on_transaction(sle)
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/stock_ledger.py”, line 509, in update_outgoing_rate_on_transaction
self.update_rate_on_delivery_and_sales_return(sle, outgoing_rate)
File “/home/frappe/frappe-bench/apps/erpnext/erpnext/stock/stock_ledger.py”, line 531, in update_rate_on_delivery_and_sales_return
frappe.db.set_value(sle.voucher_type + " Item", sle.voucher_detail_no, “incoming_rate”, outgoing_rate)
File “/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py”, line 663, in set_value
self.sql(“”"update tab{0}
File “/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py”, line 145, in sql
self._cursor.execute(query, values)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/cursors.py”, line 148, in execute
result = self._query(query)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/cursors.py”, line 310, in _query
conn.query(q)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/connections.py”, line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/connections.py”, line 775, in _read_query_result
result.read()
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/connections.py”, line 1156, in read
first_packet = self.connection._read_packet()
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/connections.py”, line 725, in _read_packet
packet.raise_for_error()
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/protocol.py”, line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/pymysql/err.py”, line 143, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.OperationalError: (1054, “Unknown column ‘incoming_rate’ in ‘field list’”)

added a custom field incoming_rate in v12 as

then I get this error:

Traceback (most recent call last):
File “/usr/lib/python3.8/runpy.py”, line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File “/usr/lib/python3.8/runpy.py”, line 87, in _run_code
exec(code, run_globals)
File “/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 104, in
main()
File “/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 19, in main
click.Group(commands=commands)(prog_name=‘bench’)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 829, in call
return self.main(*args, **kwargs)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 782, in main
rv = self.invoke(ctx)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/core.py”, line 610, in invoke
return callback(*args, **kwargs)
File “/home/frappe/frappe-bench/env/lib/python3.8/site-packages/click/decorators.py”, line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/commands/init.py”, line 27, in _func
ret = f(frappe.dict(ctx.obj), *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/commands/site.py”, line 306, in migrate
migrate(
File “/home/frappe/frappe-bench/apps/frappe/frappe/migrate.py”, line 73, in migrate
sync_fixtures()
File “/home/frappe/frappe-bench/apps/frappe/frappe/utils/fixtures.py”, line 24, in sync_fixtures
import_doc(frappe.get_app_path(app, “fixtures”, fname))
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/data_import/data_import.py”, line 186, in import_doc
import_file_by_path(
File “/home/frappe/frappe-bench/apps/frappe/frappe/modules/import_file.py”, line 69, in import_file_by_path
import_doc(doc, force=force, data_import=data_import, pre_process=pre_process,
File “/home/frappe/frappe-bench/apps/frappe/frappe/modules/import_file.py”, line 152, in import_doc
doc.insert()
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 268, in insert
self.run_post_save_methods()
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 996, in run_post_save_methods
self.run_method(“on_update”)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 861, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 1153, in composer
return composed(self, method, *args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 1136, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File “/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py”, line 855, in
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File “/home/frappe/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py”, line 76, in on_update
validate_fields_for_doctype(self.dt)
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 754, in validate_fields_for_doctype
validate_fields(meta)
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 1050, in validate_fields
check_unique_fieldname(meta.get(“name”), d.fieldname)
File “/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 788, in check_unique_fieldname
frappe.throw(
(“{0}: Fieldname {1} appears multiple times in rows {2}”).format(docname, fieldname, ", ".join(duplicates)), UniqueFieldnameError)
File “/home/frappe/frappe-bench/apps/frappe/frappe/init.py”, line 432, in throw
msgprint(msg, raise_exception=exc, title=title, indicator=‘red’, is_minimizable=is_minimizable, wide=wide, as_list=as_list)
File “/home/frappe/frappe-bench/apps/frappe/frappe/init.py”, line 411, in msgprint
_raise_exception()
File “/home/frappe/frappe-bench/apps/frappe/frappe/init.py”, line 365, in _raise_exception
raise raise_exception(msg)
frappe.core.doctype.doctype.doctype.UniqueFieldnameError: Sales Invoice Item: Fieldname incoming_rate appears multiple times in rows 75, 76