From 988ea8d61d657f3d86f82afe4d2af10bb3838996 Mon Sep 17 00:00:00 2001 From: Anupam <anupamvns0099@gmail.com> Date: Fri, 22 Jan 2021 10:45:34 +0530 Subject: [PATCH 01/27] feat: shopping portal changes --- erpnext/shopping_cart/cart.py | 7 +++++++ erpnext/templates/pages/cart.html | 3 +++ 2 files changed, 10 insertions(+) diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py index c2549fe7dd..c2d743b2a9 100644 --- a/erpnext/shopping_cart/cart.py +++ b/erpnext/shopping_cart/cart.py @@ -180,6 +180,13 @@ def create_lead_for_item_inquiry(lead, subject, message): lead_doc.update(lead) lead_doc.set('lead_owner', '') + if not frappe.db.exists('Lead Source', 'Product Inquiry'): + frappe.get_doc({ + 'doctype': 'Lead Source', + 'source_name' : 'Product Inquiry' + }).insert(ignore_permissions=True) + lead_doc.set('source', 'Product Inquiry') + try: lead_doc.save(ignore_permissions=True) except frappe.exceptions.DuplicateEntryError: diff --git a/erpnext/templates/pages/cart.html b/erpnext/templates/pages/cart.html index 3033d1587d..c06a790da3 100644 --- a/erpnext/templates/pages/cart.html +++ b/erpnext/templates/pages/cart.html @@ -47,6 +47,9 @@ {% if doc.items %} <div class="place-order-container"> + <a class="btn btn-primary-light" href="/all-products"> + {{ _("Add More") }} + </a> {% if cart_settings.enable_checkout %} <button class="btn btn-primary btn-place-order" type="button"> {{ _("Place Order") }} From 8541d9738fbcb29eabda0cff9767f4d951092eda Mon Sep 17 00:00:00 2001 From: Anupam <anupamvns0099@gmail.com> Date: Mon, 25 Jan 2021 14:18:26 +0530 Subject: [PATCH 02/27] fix: review changes --- erpnext/templates/pages/cart.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/templates/pages/cart.html b/erpnext/templates/pages/cart.html index c06a790da3..a30969825b 100644 --- a/erpnext/templates/pages/cart.html +++ b/erpnext/templates/pages/cart.html @@ -47,7 +47,7 @@ {% if doc.items %} <div class="place-order-container"> - <a class="btn btn-primary-light" href="/all-products"> + <a class="btn btn-primary-light mr-2" href="/all-products"> {{ _("Add More") }} </a> {% if cart_settings.enable_checkout %} From e6f925e5e6f121ce4726d2e8d2ad6aab92723430 Mon Sep 17 00:00:00 2001 From: Anupam <anupamvns0099@gmail.com> Date: Thu, 28 Jan 2021 15:58:03 +0530 Subject: [PATCH 03/27] review changes --- erpnext/templates/pages/cart.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/templates/pages/cart.html b/erpnext/templates/pages/cart.html index a30969825b..876eaea8e6 100644 --- a/erpnext/templates/pages/cart.html +++ b/erpnext/templates/pages/cart.html @@ -48,7 +48,7 @@ {% if doc.items %} <div class="place-order-container"> <a class="btn btn-primary-light mr-2" href="/all-products"> - {{ _("Add More") }} + {{ _("Continue Shopping") }} </a> {% if cart_settings.enable_checkout %} <button class="btn btn-primary btn-place-order" type="button"> From dce73d1881ec8f79bf3ac0376f8935a0e7122107 Mon Sep 17 00:00:00 2001 From: Deepesh Garg <deepeshgarg6@gmail.com> Date: Wed, 3 Feb 2021 12:06:36 +0530 Subject: [PATCH 04/27] fix: Add accounts user role permission for accounting dimension filter --- .../accounting_dimension_filter.json | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json index c0327ad0ad..0f3fbc0b8d 100644 --- a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json +++ b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json @@ -108,7 +108,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2020-12-16 15:27:23.659285", + "modified": "2021-02-03 12:04:58.678402", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Dimension Filter", @@ -125,6 +125,30 @@ "role": "System Manager", "share": 1, "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "share": 1, + "write": 1 } ], "quick_entry": 1, From b814b002cecb1fd8f257d16c36f022ecb1cae091 Mon Sep 17 00:00:00 2001 From: Afshan <33727827+AfshanKhan@users.noreply.github.com> Date: Fri, 5 Feb 2021 11:34:55 +0530 Subject: [PATCH 05/27] fix: creating salary slip from timesheet (#24541) --- erpnext/projects/doctype/timesheet/timesheet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index 9e807f728e..ea81b3eb64 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -288,7 +288,7 @@ def make_sales_invoice(source_name, item_code=None, customer=None): def make_salary_slip(source_name, target_doc=None): target = frappe.new_doc("Salary Slip") set_missing_values(source_name, target) - target.run_method("get_emp_and_leave_details") + target.run_method("get_emp_and_working_day_details") return target From a7820f310ca4efd59a7d585c6fa7567797579ecb Mon Sep 17 00:00:00 2001 From: prssanna <prssud@gmail.com> Date: Fri, 5 Feb 2021 14:52:31 +0530 Subject: [PATCH 06/27] fix: check if product_info exists --- erpnext/shopping_cart/product_query.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/shopping_cart/product_query.py b/erpnext/shopping_cart/product_query.py index da9e798327..8daf3d7dac 100644 --- a/erpnext/shopping_cart/product_query.py +++ b/erpnext/shopping_cart/product_query.py @@ -73,7 +73,8 @@ class ProductQuery: for item in result: product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get('product_info') - item.formatted_price = product_info['price'].get('formatted_price') if product_info['price'] else None + if product_info: + item.formatted_price = product_info['price'].get('formatted_price') if product_info['price'] else None return result From 91b41db9e374dc295bb1ae83f653d23ccadea5d4 Mon Sep 17 00:00:00 2001 From: prssanna <prssud@gmail.com> Date: Fri, 5 Feb 2021 17:34:56 +0530 Subject: [PATCH 07/27] fix: check if product_info exists before setting price --- erpnext/portal/product_configurator/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/portal/product_configurator/utils.py b/erpnext/portal/product_configurator/utils.py index 4693d44509..21fd7c2878 100644 --- a/erpnext/portal/product_configurator/utils.py +++ b/erpnext/portal/product_configurator/utils.py @@ -386,7 +386,8 @@ def get_items(filters=None, search=None): r.description = r.web_long_description or r.description r.image = r.website_image or r.image product_info = get_product_info_for_website(r.item_code, skip_quotation_creation=True).get('product_info') - r.formatted_price = product_info['price'].get('formatted_price') if product_info['price'] else None + if product_info: + r.formatted_price = product_info['price'].get('formatted_price') if product_info['price'] else None return results From c4a1bb0e1c1eddc747fe050ee05e625f8d0d7e8a Mon Sep 17 00:00:00 2001 From: Nabin Hait <nabinhait@gmail.com> Date: Fri, 5 Feb 2021 10:04:18 -0800 Subject: [PATCH 08/27] fix: couple of travis fixes (#24554) Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- .../doctype/inpatient_record/test_inpatient_record.py | 1 + erpnext/hr/doctype/employee/test_employee.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py index 8a918b0275..ea0d1e982d 100644 --- a/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py +++ b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py @@ -139,6 +139,7 @@ def create_inpatient(patient): inpatient_record.phone = patient_obj.phone inpatient_record.inpatient = "Scheduled" inpatient_record.scheduled_date = today() + inpatient_record.company = "_Test Company" return inpatient_record diff --git a/erpnext/hr/doctype/employee/test_employee.py b/erpnext/hr/doctype/employee/test_employee.py index f4b214adc3..c0e614ac08 100644 --- a/erpnext/hr/doctype/employee/test_employee.py +++ b/erpnext/hr/doctype/employee/test_employee.py @@ -16,11 +16,13 @@ class TestEmployee(unittest.TestCase): employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0]) employee.date_of_birth = "1992" + frappe.utils.nowdate()[4:] employee.company_email = "test@example.com" + employee.company = "_Test Company" employee.save() from erpnext.hr.doctype.employee.employee import get_employees_who_are_born_today, send_birthday_reminders - self.assertTrue(employee.name in [e.name for e in get_employees_who_are_born_today()]) + employees_born_today = get_employees_who_are_born_today() + self.assertTrue(employees_born_today.get("_Test Company")) frappe.db.sql("delete from `tabEmail Queue`") From ffb36aac8f604e88caa6c77951dea6fe33f30676 Mon Sep 17 00:00:00 2001 From: Anuja Pawar <60467153+Anuja-pawar@users.noreply.github.com> Date: Fri, 5 Feb 2021 23:35:47 +0530 Subject: [PATCH 09/27] fix: fixing item_code not found error in the report (#24483) --- .../item_wise_sales_register/item_wise_sales_register.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 998003ac69..928b373eff 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 @@ -52,8 +52,8 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum row = { 'item_code': d.item_code, - 'item_name': item_record.item_name, - 'item_group': item_record.item_group, + 'item_name': item_record.item_name if item_record else d.item_name, + 'item_group': item_record.item_group if item_record else d.item_group, 'description': d.description, 'invoice': d.parent, 'posting_date': d.posting_date, @@ -383,6 +383,7 @@ def get_items(filters, additional_query_columns): `tabSales Invoice`.project, `tabSales Invoice`.customer, `tabSales Invoice`.remarks, `tabSales Invoice`.territory, `tabSales Invoice`.company, `tabSales Invoice`.base_net_total, `tabSales Invoice Item`.item_code, `tabSales Invoice Item`.description, + `tabSales Invoice Item`.`item_name`, `tabSales Invoice Item`.`item_group`, `tabSales Invoice Item`.sales_order, `tabSales Invoice Item`.delivery_note, `tabSales Invoice Item`.income_account, `tabSales Invoice Item`.cost_center, `tabSales Invoice Item`.stock_qty, `tabSales Invoice Item`.stock_uom, From f29b811a565ea619f12895ef41f187dfc81a6dbc Mon Sep 17 00:00:00 2001 From: Saqib <nextchamp.saqib@gmail.com> Date: Sat, 6 Feb 2021 17:55:20 +0530 Subject: [PATCH 10/27] fix(e-invoice): do not validate gstin for exports (#24561) --- erpnext/regional/india/e_invoice/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index c8e7e149c4..7d9b2fd624 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -303,7 +303,7 @@ def validate_mandatory_fields(invoice): _('GSTIN is mandatory to fetch company GSTIN details. Please enter GSTIN in selected company address.'), title=_('Missing Fields') ) - if not frappe.db.get_value('Address', invoice.customer_address, 'gstin'): + if invoice.gst_category != 'Overseas' and not frappe.db.get_value('Address', invoice.customer_address, 'gstin'): frappe.throw( _('GSTIN is mandatory to fetch customer GSTIN details. Please enter GSTIN in selected customer address.'), title=_('Missing Fields') From a97eb6a052b605ef06137e128eed66052bdf4965 Mon Sep 17 00:00:00 2001 From: marination <maricadsouza221197@gmail.com> Date: Sun, 7 Feb 2021 22:27:40 +0530 Subject: [PATCH 11/27] fix: Empty State text font weight in Item Dashboard --- erpnext/stock/dashboard/item_dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/dashboard/item_dashboard.js b/erpnext/stock/dashboard/item_dashboard.js index 9dbb64c343..95cb92b1b3 100644 --- a/erpnext/stock/dashboard/item_dashboard.js +++ b/erpnext/stock/dashboard/item_dashboard.js @@ -132,7 +132,7 @@ erpnext.stock.ItemDashboard = Class.extend({ var message = __("No Stock Available Currently"); this.content.find('.result').css('text-align', 'center'); - $(`<div class='text-muted' style='margin: 20px 5px; font-weight: lighter;'> + $(`<div class='text-muted' style='margin: 20px 5px;'> ${message} </div>`).appendTo(this.result); } }, From 9490122abb40ffff8d987c4bdb85d7aa38e92c1e Mon Sep 17 00:00:00 2001 From: Saqib <nextchamp.saqib@gmail.com> Date: Mon, 8 Feb 2021 11:40:56 +0530 Subject: [PATCH 12/27] fix(e-invoice): skip e-invoice generation for non-taxable invoices (#24568) --- erpnext/regional/india/e_invoice/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index 7d9b2fd624..5b898d52a1 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -20,11 +20,13 @@ from frappe.utils.data import cstr, cint, format_date, flt, time_diff_in_seconds def validate_einvoice_fields(doc): einvoicing_enabled = cint(frappe.db.get_value('E Invoice Settings', 'E Invoice Settings', 'enable')) - invalid_doctype = doc.doctype not in ['Sales Invoice'] + invalid_doctype = doc.doctype != 'Sales Invoice' invalid_supply_type = doc.get('gst_category') not in ['Registered Regular', 'SEZ', 'Overseas', 'Deemed Export'] company_transaction = doc.get('billing_address_gstin') == doc.get('company_gstin') + no_taxes_applied = len(doc.get('taxes')) == 0 - if not einvoicing_enabled or invalid_doctype or invalid_supply_type or company_transaction: return + if not einvoicing_enabled or invalid_doctype or invalid_supply_type or company_transaction or no_taxes_applied: + return if doc.docstatus == 0 and doc._action == 'save': if doc.irn: From 53dbe39d12c955df7cfd8d967fa0c077a8c49042 Mon Sep 17 00:00:00 2001 From: Afshan <33727827+AfshanKhan@users.noreply.github.com> Date: Mon, 8 Feb 2021 12:32:42 +0530 Subject: [PATCH 13/27] fix: StopIteration error when e-invoice not enabled (#24548) * fix: StopIteration error when e-invoice not enabled * chore: update message Co-authored-by: Saqib <nextchamp.saqib@gmail.com> --- erpnext/regional/india/e_invoice/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index 5b898d52a1..e64be4b645 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -446,6 +446,8 @@ class GSPConnector(): def get_credentials(self): if self.invoice: gstin = self.get_seller_gstin() + if not self.e_invoice_settings.enable: + frappe.throw(_("E-Invoicing is disabled. Please enable it from {} to generate e-invoices.").format(get_link_to_form("E Invoice Settings", "E Invoice Settings"))) credentials = next(d for d in self.e_invoice_settings.credentials if d.gstin == gstin) else: credentials = self.e_invoice_settings.credentials[0] if self.e_invoice_settings.credentials else None @@ -819,4 +821,4 @@ def generate_eway_bill(doctype, docname, **kwargs): @frappe.whitelist() def cancel_eway_bill(doctype, docname, eway_bill, reason, remark): gsp_connector = GSPConnector(doctype, docname) - gsp_connector.cancel_eway_bill(eway_bill, reason, remark) \ No newline at end of file + gsp_connector.cancel_eway_bill(eway_bill, reason, remark) From 5a7ddba9a319f666a348816beea843a8a99bd3a0 Mon Sep 17 00:00:00 2001 From: marination <maricadsouza221197@gmail.com> Date: Mon, 8 Feb 2021 17:06:23 +0530 Subject: [PATCH 14/27] fix: Avoid changing Ref. Doctype in Accounting Dimension after creation --- .../accounting_dimension/accounting_dimension.json | 3 ++- .../accounting_dimension/accounting_dimension.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json index cf55d554fb..5858f10bb0 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json @@ -30,6 +30,7 @@ "fieldtype": "Link", "label": "Reference Document Type", "options": "DocType", + "read_only_depends_on": "eval:!doc.__islocal", "reqd": 1 }, { @@ -48,7 +49,7 @@ } ], "links": [], - "modified": "2020-03-22 20:34:39.805728", + "modified": "2021-02-08 16:37:53.936656", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Dimension", diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index ef0d3a3cb1..dd26c4cec2 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -29,6 +29,16 @@ class AccountingDimension(Document): if exists and self.is_new(): frappe.throw("Document Type already used as a dimension") + if not self.is_new(): + self.validate_document_type_change() + + def validate_document_type_change(self): + doctype_before_save = frappe.db.get_value("Accounting Dimension", self.name, "document_type") + if doctype_before_save != self.document_type: + message = _("Cannot change Reference Document Type.") + message += _("Please create a new Accounting Dimension if required.") + frappe.throw(message) + def after_insert(self): if frappe.flags.in_test: make_dimension_in_accounting_doctypes(doc=self) From c4d67c2afeae8916de364a68d2a763150c589bea Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Mon, 8 Feb 2021 18:42:27 +0530 Subject: [PATCH 15/27] refactor: Move call_popup style from less to scss - Add style for audio --- erpnext/public/build.json | 2 +- erpnext/public/less/call_popup.less | 9 --------- erpnext/public/scss/call_popup.scss | 21 +++++++++++++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) delete mode 100644 erpnext/public/less/call_popup.less create mode 100644 erpnext/public/scss/call_popup.scss diff --git a/erpnext/public/build.json b/erpnext/public/build.json index 4a40e8e8f9..7326238273 100644 --- a/erpnext/public/build.json +++ b/erpnext/public/build.json @@ -2,7 +2,7 @@ "css/erpnext.css": [ "public/less/erpnext.less", "public/less/hub.less", - "public/less/call_popup.less", + "public/scss/call_popup.scss", "public/scss/point-of-sale.scss" ], "css/marketplace.css": [ diff --git a/erpnext/public/less/call_popup.less b/erpnext/public/less/call_popup.less deleted file mode 100644 index 32e85ce16d..0000000000 --- a/erpnext/public/less/call_popup.less +++ /dev/null @@ -1,9 +0,0 @@ -.call-popup { - a:hover { - text-decoration: underline; - } - .for-description { - max-height: 250px; - overflow: scroll; - } -} \ No newline at end of file diff --git a/erpnext/public/scss/call_popup.scss b/erpnext/public/scss/call_popup.scss new file mode 100644 index 0000000000..95e31828c1 --- /dev/null +++ b/erpnext/public/scss/call_popup.scss @@ -0,0 +1,21 @@ +.call-popup { + a:hover { + text-decoration: underline; + } + .for-description { + max-height: 250px; + overflow: scroll; + } +} + +audio { + height: 40px; + width: 100%; + max-width: 500px; + background-color: var(--control-bg); + border-radius: var(--border-radius-sm); + &-webkit-media-controls-panel { + background: var(--control-bg); + } + outline: none; +} From 723e6dd73fb76dece4ada93f4b5d4122f8bf28db Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Mon, 8 Feb 2021 18:43:26 +0530 Subject: [PATCH 16/27] fix: Update style of call log shown in timeline --- erpnext/public/js/templates/call_link.html | 39 +++++++++---------- .../telephony/doctype/call_log/call_log.py | 2 + 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/erpnext/public/js/templates/call_link.html b/erpnext/public/js/templates/call_link.html index 08bdf142a7..071078c776 100644 --- a/erpnext/public/js/templates/call_link.html +++ b/erpnext/public/js/templates/call_link.html @@ -1,32 +1,31 @@ <div class="call-detail-wrapper"> - <div class="left-arrow"></div> - <div class="head text-muted"> + <div class="head flex justify-between"> + <div> + <span class="bold"> {{ type }} Call</span> + {% if (duration) %} + <span class="text-muted"> • {{ frappe.format(duration, { fieldtype: "Duration" }) }}</span> + {% endif %} + <span class="text-muted"> • {{ comment_when(creation) }}</span> + </div> <span> - <i class="fa fa-phone"> </i> - <span> - <span> {{ type }} Call</span> - - - <span> {{ frappe.format(duration, { fieldtype: "Duration" }) }}</span> - - - <span> {{ comment_when(creation) }}</span> - - - <!-- <span> {{ status }}</span> - - --> - <a class="text-muted" href="#Form/Call Log/{{name}}">Details</a> - {% if (show_call_button) { %} - <a class="pull-right">Callback</a> - {% } %} + <a class="action-btn" href="/app/call-log/{{ name }}" title="{{ __("Open Call Log") }}"> + <svg class="icon icon-sm"> + <use href="#icon-link-url" class="like-icon"></use> + </svg> + </a> + </span> </div> - <div class="body padding"> + + + <div class="body pt-3"> {% if (type === "Incoming") { %} <span> Incoming call from {{ from }}, received by {{ to }}</span> {% } else { %} <span> Outgoing Call made by {{ from }} to {{ to }}</span> {% } %} - <hr> - <div class="summary"> + <div class="summary pt-3"> {% if (summary) { %} - <span>{{ summary }}</span> + <i>{{ summary }}</i> {% } else { %} <i class="text-muted">{{ __("No Summary") }}</i> {% } %} diff --git a/erpnext/telephony/doctype/call_log/call_log.py b/erpnext/telephony/doctype/call_log/call_log.py index a277a5f956..4d553df08b 100644 --- a/erpnext/telephony/doctype/call_log/call_log.py +++ b/erpnext/telephony/doctype/call_log/call_log.py @@ -165,6 +165,8 @@ def get_linked_call_logs(doctype, docname): for log in logs: log.show_call_button = 0 timeline_contents.append({ + 'icon': 'call', + 'is_card': True, 'creation': log.creation, 'template': 'call_link', 'template_data': log From ba26020a824436545b933d1469f4de07fe72f06a Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Mon, 8 Feb 2021 18:45:55 +0530 Subject: [PATCH 17/27] fix: Show audio interface in call log which has recording URL - Also, remove unneccesary column & section break in call log doctype --- .../telephony/doctype/call_log/call_log.js | 25 +++++++++++++++-- .../telephony/doctype/call_log/call_log.json | 28 ++++++++----------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/erpnext/telephony/doctype/call_log/call_log.js b/erpnext/telephony/doctype/call_log/call_log.js index 977f86da0d..e7afa0b7d0 100644 --- a/erpnext/telephony/doctype/call_log/call_log.js +++ b/erpnext/telephony/doctype/call_log/call_log.js @@ -2,7 +2,26 @@ // For license information, please see license.txt frappe.ui.form.on('Call Log', { - // refresh: function(frm) { - - // } + refresh: function(frm) { + frm.events.setup_recording_audio_control(frm); + const incoming_call = frm.doc.type == 'Incoming'; + frm.add_custom_button(incoming_call ? __('Callback'): __('Call Again'), () => { + const number = incoming_call ? frm.doc.from : frm.doc.to; + frappe.phone_call.handler(number, frm); + }); + }, + setup_recording_audio_control(frm) { + const recording_wrapper = frm.get_field('recording_html').$wrapper; + if (!frm.doc.recording_url || frm.doc.recording_url == 'null') { + recording_wrapper.empty(); + } else { + recording_wrapper.addClass('input-max-width'); + recording_wrapper.html(` + <audio + controls + src="${frm.doc.recording_url}"> + </audio> + `); + } + } }); diff --git a/erpnext/telephony/doctype/call_log/call_log.json b/erpnext/telephony/doctype/call_log/call_log.json index 1ecd884bbd..1d6c39edf6 100644 --- a/erpnext/telephony/doctype/call_log/call_log.json +++ b/erpnext/telephony/doctype/call_log/call_log.json @@ -5,6 +5,7 @@ "doctype": "DocType", "engine": "InnoDB", "field_order": [ + "call_details_section", "id", "from", "to", @@ -21,20 +22,9 @@ "section_break_11", "summary", "section_break_19", - "links", - "column_break_3", - "section_break_5" + "links" ], "fields": [ - { - "fieldname": "column_break_3", - "fieldtype": "Column Break" - }, - { - "fieldname": "section_break_5", - "fieldtype": "Section Break", - "label": "Call Details" - }, { "fieldname": "id", "fieldtype": "Data", @@ -75,6 +65,7 @@ { "fieldname": "recording_url", "fieldtype": "Data", + "hidden": 1, "label": "Recording URL" }, { @@ -112,13 +103,13 @@ }, { "fieldname": "summary", - "fieldtype": "Small Text", - "label": "Call Summary" + "fieldtype": "Small Text" }, { "fieldname": "section_break_11", "fieldtype": "Section Break", - "hide_border": 1 + "hide_border": 1, + "label": "Call Summary" }, { "fieldname": "start_time", @@ -138,12 +129,17 @@ "label": "Customer", "options": "Customer", "read_only": 1 + }, + { + "fieldname": "call_details_section", + "fieldtype": "Section Break", + "label": "Call Details" } ], "in_create": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2021-01-13 12:28:20.288985", + "modified": "2021-02-08 14:23:28.744844", "modified_by": "Administrator", "module": "Telephony", "name": "Call Log", From c5248b30ebda26bd89fece350de6a9f11ec95879 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Mon, 8 Feb 2021 18:50:05 +0530 Subject: [PATCH 18/27] fix: Do not re-use call popup if call ID is different --- erpnext/public/js/call_popup/call_popup.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/public/js/call_popup/call_popup.js b/erpnext/public/js/call_popup/call_popup.js index be1745e54f..f3d09ee998 100644 --- a/erpnext/public/js/call_popup/call_popup.js +++ b/erpnext/public/js/call_popup/call_popup.js @@ -191,11 +191,12 @@ class CallPopup { $(document).on('app_ready', function () { frappe.realtime.on('show_call_popup', call_log => { - if (!erpnext.call_popup) { + let call_popup = erpnext.call_popup; + if (call_popup && call_log.name === call_popup.call_log.name) { erpnext.call_popup = new CallPopup(call_log); } else { - erpnext.call_popup.update_call_log(call_log); - erpnext.call_popup.dialog.show(); + call_popup.update_call_log(call_log); + call_popup.dialog.show(); } }); }); From dcc9947d10d0810b9b61028f98431cf95d5a32cb Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Mon, 8 Feb 2021 20:13:23 +0530 Subject: [PATCH 19/27] fix: Update call_popup - Setup missed & call ended listeners - Show contacts based on links --- erpnext/crm/doctype/lead/lead.py | 4 +- erpnext/public/js/call_popup/call_popup.js | 237 +++++++++++---------- 2 files changed, 125 insertions(+), 116 deletions(-) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index 938cbfdc85..d1d096843b 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -352,7 +352,7 @@ def get_lead_with_phone_number(number): leads = frappe.get_all('Lead', or_filters={ 'phone': ['like', '%{}'.format(number)], 'mobile_no': ['like', '%{}'.format(number)] - }, limit=1) + }, limit=1, order_by="creation DESC") lead = leads[0].name if leads else None @@ -361,4 +361,4 @@ def get_lead_with_phone_number(number): def daily_open_lead(): leads = frappe.get_all("Lead", filters = [["contact_date", "Between", [nowdate(), nowdate()]]]) for lead in leads: - frappe.db.set_value("Lead", lead.name, "status", "Open") \ No newline at end of file + frappe.db.set_value("Lead", lead.name, "status", "Open") diff --git a/erpnext/public/js/call_popup/call_popup.js b/erpnext/public/js/call_popup/call_popup.js index f3d09ee998..24297885a2 100644 --- a/erpnext/public/js/call_popup/call_popup.js +++ b/erpnext/public/js/call_popup/call_popup.js @@ -7,10 +7,103 @@ class CallPopup { } make() { + frappe.utils.play_sound('incoming-call'); this.dialog = new frappe.ui.Dialog({ 'static': true, - 'minimizable': true, - 'fields': [{ + 'minimizable': true + }); + this.dialog.get_close_btn().show(); + this.setup_dialog(); + this.set_call_status(); + frappe.utils.bind_actions_with_object(this.dialog.$body, this); + this.dialog.$wrapper.addClass('call-popup'); + this.dialog.get_close_btn().unbind('click').click(this.close_modal.bind(this)); + this.dialog.show(); + } + + setup_dialog() { + this.setup_call_details(); + this.dialog.$body.empty().append(this.caller_info); + } + + set_indicator(color, blink=false) { + let classes = `indicator ${color} ${blink ? 'blink': ''}`; + this.dialog.header.find('.indicator').attr('class', classes); + } + + set_call_status(call_status) { + let title = ''; + call_status = call_status || this.call_log.status; + if (['Ringing'].includes(call_status) || !call_status) { + title = __('Incoming call from {0}', [this.get_caller_name() || this.caller_number]); + this.set_indicator('blue', true); + } else if (call_status === 'In Progress') { + title = __('Call Connected'); + this.set_indicator('green'); + } else if (['No Answer', 'Missed'].includes(call_status)) { + this.set_indicator('yellow'); + title = __('Call Missed'); + } else if (['Completed', 'Busy', 'Failed'].includes(call_status)) { + this.set_indicator('red'); + title = __('Call Ended'); + } else { + this.set_indicator('blue'); + title = call_status; + } + this.dialog.set_title(title); + } + + update_call_log(call_log, missed) { + this.call_log = call_log; + this.set_call_status(missed ? 'Missed': null); + } + + close_modal() { + this.dialog.hide(); + delete erpnext.call_popup; + } + + call_ended(call_log, missed) { + frappe.utils.play_sound('call-disconnect'); + this.update_call_log(call_log, missed); + setTimeout(() => { + if (!this.dialog.get_value('call_summary')) { + this.close_modal(); + } + }, 60000); + this.clear_listeners(); + } + + get_caller_name() { + const contact_link = this.get_contact_link(); + return contact_link.link_title || contact_link.link_name; + } + + get_contact_link() { + let log = this.call_log; + let contact_link = log.links.find(d => d.link_doctype === 'Contact'); + return contact_link || {}; + } + + setup_listener() { + frappe.realtime.on(`call_${this.call_log.id}_ended`, call_log => { + this.call_ended(call_log); + }); + + frappe.realtime.on(`call_${this.call_log.id}_missed`, call_log => { + this.call_ended(call_log, true); + }); + } + + clear_listeners() { + frappe.realtime.off(`call_${this.call_log.id}_ended`); + frappe.realtime.off(`call_${this.call_log.id}_missed`); + } + + setup_call_details() { + this.caller_info = $(`<div></div>`); + this.call_details = new frappe.ui.FieldGroup({ + fields: [{ 'fieldname': 'name', 'label': 'Name', 'default': this.get_caller_name() || __('Unknown Caller'), @@ -19,17 +112,17 @@ class CallPopup { }, { 'fieldtype': 'Button', 'label': __('Open Contact'), - 'click': () => frappe.set_route('Form', 'Contact', this.call_log.contact), - 'depends_on': () => this.call_log.contact - }, { - 'fieldtype': 'Button', - 'label': __('Open Lead'), - 'click': () => frappe.set_route('Form', 'Lead', this.call_log.lead), - 'depends_on': () => this.call_log.lead + 'click': () => frappe.set_route('Form', 'Contact', this.get_contact_link().link_name), + 'depends_on': () => this.get_caller_name() }, { 'fieldtype': 'Button', 'label': __('Create New Contact'), - 'click': () => frappe.new_doc('Contact', { 'mobile_no': this.caller_number }), + 'click': this.create_new_contact.bind(this), + 'depends_on': () => !this.get_caller_name() + }, { + 'fieldtype': 'Button', + 'label': __('Create New Customer'), + 'click': this.create_new_customer.bind(this), 'depends_on': () => !this.get_caller_name() }, { 'fieldtype': 'Button', @@ -44,26 +137,9 @@ class CallPopup { 'fieldtype': 'Data', 'default': this.caller_number, 'read_only': 1 - }, { - 'fielname': 'last_interaction', - 'fieldtype': 'Section Break', - 'label': __('Activity'), - 'depends_on': () => this.get_caller_name() - }, { - 'fieldtype': 'Small Text', - 'label': __('Last Issue'), - 'fieldname': 'last_issue', - 'read_only': true, - 'depends_on': () => this.call_log.contact, - 'default': `<i class="text-muted">${__('No issue has been raised by the caller.')}<i>` - }, { - 'fieldtype': 'Small Text', - 'label': __('Last Communication'), - 'fieldname': 'last_communication', - 'read_only': true, - 'default': `<i class="text-muted">${__('No communication found.')}<i>` }, { 'fieldtype': 'Section Break', + 'hide_border': 1, }, { 'fieldtype': 'Small Text', 'label': __('Call Summary'), @@ -72,7 +148,7 @@ class CallPopup { 'fieldtype': 'Button', 'label': __('Save'), 'click': () => { - const call_summary = this.dialog.get_value('call_summary'); + const call_summary = this.call_details.get_value('call_summary'); if (!call_summary) return; frappe.xcall('erpnext.telephony.doctype.call_log.call_log.add_call_summary', { 'call_log': this.call_log.name, @@ -94,98 +170,29 @@ class CallPopup { }); } }], + body: this.caller_info }); - this.set_call_status(); - this.dialog.get_close_btn().show(); - this.make_last_interaction_section(); - this.dialog.$body.addClass('call-popup'); - this.dialog.set_secondary_action(this.close_modal.bind(this)); - frappe.utils.play_sound('incoming-call'); - this.dialog.show(); + this.call_details.make(); } - set_indicator(color, blink=false) { - let classes = `indicator ${color} ${blink ? 'blink': ''}`; - this.dialog.header.find('.indicator').attr('class', classes); + is_known_caller() { + return Boolean(this.get_caller_name()); } - set_call_status(call_status) { - let title = ''; - call_status = call_status || this.call_log.status; - if (['Ringing'].includes(call_status) || !call_status) { - title = __('Incoming call from {0}', [this.get_caller_name() || this.caller_number]); - this.set_indicator('blue', true); - } else if (call_status === 'In Progress') { - title = __('Call Connected'); - this.set_indicator('yellow'); - } else if (call_status === 'Missed') { - this.set_indicator('red'); - title = __('Call Missed'); - } else if (['Completed', 'Disconnected'].includes(call_status)) { - this.set_indicator('red'); - title = __('Call Disconnected'); - } else { - this.set_indicator('blue'); - title = call_status; - } - this.dialog.set_title(title); + create_new_customer() { + // to avoid quick entry form + const new_customer = frappe.model.get_new_doc('Customer'); + new_customer.mobile_no = this.caller_number; + frappe.set_route('Form', new_customer.doctype, new_customer.name); } - update_call_log(call_log) { - this.call_log = call_log; - this.set_call_status(); - } - - close_modal() { - this.dialog.hide(); - delete erpnext.call_popup; - } - - call_disconnected(call_log) { - frappe.utils.play_sound('call-disconnect'); - this.update_call_log(call_log); - setTimeout(() => { - if (!this.dialog.get_value('call_summary')) { - this.close_modal(); - } - }, 30000); - } - - make_last_interaction_section() { - frappe.xcall('erpnext.crm.doctype.utils.get_last_interaction', { - 'contact': this.call_log.contact, - 'lead': this.call_log.lead - }).then(data => { - const comm_field = this.dialog.get_field('last_communication'); - if (data.last_communication) { - const comm = data.last_communication; - comm_field.set_value(comm.content); - } - - if (data.last_issue) { - const issue = data.last_issue; - const issue_field = this.dialog.get_field("last_issue"); - issue_field.set_value(issue.subject); - issue_field.$wrapper.append(` - <a class="text-medium" href="/app/issue?customer=${issue.customer}"> - ${__('View all issues from {0}', [issue.customer])} - </a> - `); - } - }); - } - - get_caller_name() { - let log = this.call_log; - return log.contact_name || log.lead_name; - } - - setup_listener() { - frappe.realtime.on(`call_${this.call_log.id}_disconnected`, call_log => { - this.call_disconnected(call_log); - // Remove call disconnect listener after the call is disconnected - frappe.realtime.off(`call_${this.call_log.id}_disconnected`); - }); + create_new_contact() { + // TODO: fix new_doc, it should accept child table values + const new_contact = frappe.model.get_new_doc('Contact'); + const phone_no = frappe.model.add_child(new_contact, 'Contact Phone', 'phone_nos'); + phone_no.phone = this.caller_number; + phone_no.is_primary_mobile_no = 1; + frappe.set_route('Form', new_contact.doctype, new_contact.name); } } @@ -200,3 +207,5 @@ $(document).on('app_ready', function () { } }); }); + +window.CallPopup = CallPopup; From 8991d4ed0b9a67e282063e2e8ba18de82e8e043d Mon Sep 17 00:00:00 2001 From: Saqib <nextchamp.saqib@gmail.com> Date: Mon, 8 Feb 2021 20:19:11 +0530 Subject: [PATCH 20/27] fix: fetching of standalone cr/dr notes for reconciliation (#24575) --- .../payment_reconciliation.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index 791b03a0d7..f7a15c04fa 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -88,19 +88,19 @@ class PaymentReconciliation(Document): voucher_type = ('Sales Invoice' if self.party_type == 'Customer' else "Purchase Invoice") - return frappe.db.sql(""" SELECT `tab{doc}`.name as reference_name, %(voucher_type)s as reference_type, - (sum(`tabGL Entry`.{dr_or_cr}) - sum(`tabGL Entry`.{reconciled_dr_or_cr})) as amount, + return frappe.db.sql(""" SELECT doc.name as reference_name, %(voucher_type)s as reference_type, + (sum(gl.{dr_or_cr}) - sum(gl.{reconciled_dr_or_cr})) as amount, account_currency as currency - FROM `tab{doc}`, `tabGL Entry` + FROM `tab{doc}` doc, `tabGL Entry` gl WHERE - (`tab{doc}`.name = `tabGL Entry`.against_voucher or `tab{doc}`.name = `tabGL Entry`.voucher_no) - and `tab{doc}`.{party_type_field} = %(party)s - and `tab{doc}`.is_return = 1 and `tab{doc}`.return_against IS NULL - and `tabGL Entry`.against_voucher_type = %(voucher_type)s - and `tab{doc}`.docstatus = 1 and `tabGL Entry`.party = %(party)s - and `tabGL Entry`.party_type = %(party_type)s and `tabGL Entry`.account = %(account)s - and `tabGL Entry`.is_cancelled = 0 - GROUP BY `tab{doc}`.name + (doc.name = gl.against_voucher or doc.name = gl.voucher_no) + and doc.{party_type_field} = %(party)s + and doc.is_return = 1 and ifnull(doc.return_against, "") = "" + and gl.against_voucher_type = %(voucher_type)s + and doc.docstatus = 1 and gl.party = %(party)s + and gl.party_type = %(party_type)s and gl.account = %(account)s + and gl.is_cancelled = 0 + GROUP BY doc.name Having amount > 0 """.format( @@ -113,7 +113,7 @@ class PaymentReconciliation(Document): 'party_type': self.party_type, 'voucher_type': voucher_type, 'account': self.receivable_payable_account - }, as_dict=1) + }, as_dict=1, debug=1) def add_payment_entries(self, entries): self.set('payments', []) From 1016ff48fcd984c7e2e6be0d2d0d377ef021c4c0 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Tue, 9 Feb 2021 12:17:29 +0530 Subject: [PATCH 21/27] fix: Create new call popup if call popup does not exists --- erpnext/public/js/call_popup/call_popup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/public/js/call_popup/call_popup.js b/erpnext/public/js/call_popup/call_popup.js index 24297885a2..c954f12ac6 100644 --- a/erpnext/public/js/call_popup/call_popup.js +++ b/erpnext/public/js/call_popup/call_popup.js @@ -200,10 +200,10 @@ $(document).on('app_ready', function () { frappe.realtime.on('show_call_popup', call_log => { let call_popup = erpnext.call_popup; if (call_popup && call_log.name === call_popup.call_log.name) { - erpnext.call_popup = new CallPopup(call_log); - } else { call_popup.update_call_log(call_log); call_popup.dialog.show(); + } else { + erpnext.call_popup = new CallPopup(call_log); } }); }); From 5164223b99b2792211a4edc9568cb13f2a0d76c2 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Tue, 9 Feb 2021 16:22:28 +0530 Subject: [PATCH 22/27] fix: error on group by filter (#24587) Co-authored-by: Afshan <33727827+AfshanKhan@users.noreply.github.com> --- .../monthly_attendance_sheet.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py index 46082129e2..c5929c6bf9 100644 --- a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py +++ b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py @@ -36,6 +36,8 @@ def execute(filters=None): conditions, filters = get_conditions(filters) columns, days = get_columns(filters) att_map = get_attendance_list(conditions, filters) + if not att_map: + return columns, [], None, None if filters.group_by: emp_map, group_by_parameters = get_employee_details(filters.group_by, filters.company) @@ -65,10 +67,14 @@ def execute(filters=None): if filters.group_by: emp_att_map = {} for parameter in group_by_parameters: - data.append([ "<b>"+ parameter + "</b>"]) - record, aaa = add_data(emp_map[parameter], att_map, filters, holiday_map, conditions, default_holiday_list, leave_list=leave_list) - emp_att_map.update(aaa) - data += record + emp_map_set = set([key for key in emp_map[parameter].keys()]) + att_map_set = set([key for key in att_map.keys()]) + if (att_map_set & emp_map_set): + parameter_row = ["<b>"+ parameter + "</b>"] + ['' for day in range(filters["total_days_in_month"] + 2)] + data.append(parameter_row) + record, emp_att_data = add_data(emp_map[parameter], att_map, filters, holiday_map, conditions, default_holiday_list, leave_list=leave_list) + emp_att_map.update(emp_att_data) + data += record else: record, emp_att_map = add_data(emp_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_list=leave_list) data += record @@ -237,6 +243,9 @@ def get_attendance_list(conditions, filters): status from tabAttendance where docstatus = 1 %s order by employee, attendance_date""" % conditions, filters, as_dict=1) + if not attendance_list: + msgprint(_("No attendance record found"), alert=True, indicator="orange") + att_map = {} for d in attendance_list: att_map.setdefault(d.employee, frappe._dict()).setdefault(d.day_of_month, "") From 6fa44fefc3907faeb7807a523bb83bae72ff9977 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Wed, 10 Feb 2021 15:48:32 +0530 Subject: [PATCH 23/27] fix: Use new favicon --- erpnext/hooks.py | 2 +- erpnext/public/images/erpnext-favicon.svg | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 erpnext/public/images/erpnext-favicon.svg diff --git a/erpnext/hooks.py b/erpnext/hooks.py index bc1d7628ff..109d9216e7 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -78,7 +78,7 @@ website_generators = ["Item Group", "Item", "BOM", "Sales Partner", "Job Opening", "Student Admission"] website_context = { - "favicon": "/assets/erpnext/images/favicon.png", + "favicon": "/assets/erpnext/images/erpnext-favicon.svg", "splash_image": "/assets/erpnext/images/erpnext-logo.svg" } diff --git a/erpnext/public/images/erpnext-favicon.svg b/erpnext/public/images/erpnext-favicon.svg new file mode 100644 index 0000000000..a3ac3bb2ce --- /dev/null +++ b/erpnext/public/images/erpnext-favicon.svg @@ -0,0 +1,5 @@ +<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M0 12C0 5.37258 5.37258 0 12 0H88C94.6274 0 100 5.37258 100 12V88C100 94.6274 94.6274 100 88 100H12C5.37258 100 0 94.6274 0 88V12Z" fill="#0089FF"/> +<path d="M65.7097 32.9462H67.3871V24H33V32.9462H43.9032H65.7097Z" fill="white"/> +<path d="M43.9032 66.2151V53.914H65.7097V44.9677H43.9032H33V75.1613H67.6667V66.2151H43.9032Z" fill="white"/> +</svg> \ No newline at end of file From 5f27c9e100cd2acf6c95380fb2c634acd069bad2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <surajshetty3416@gmail.com> Date: Wed, 10 Feb 2021 15:48:58 +0530 Subject: [PATCH 24/27] chore: Remove unnecessary image files --- erpnext/public/images/erp-icon.svg | 21 ------------------ erpnext/public/images/erpnext-12.svg | 26 ----------------------- erpnext/public/images/erpnext-footer.png | Bin 1937 -> 0 bytes erpnext/public/images/erpnext-logo.png | Bin 11639 -> 0 bytes erpnext/public/images/erpnext_logo.svg | 4 ---- erpnext/public/images/favicon.png | Bin 1696 -> 0 bytes erpnext/public/images/splash.png | Bin 10615 -> 0 bytes 7 files changed, 51 deletions(-) delete mode 100644 erpnext/public/images/erp-icon.svg delete mode 100644 erpnext/public/images/erpnext-12.svg delete mode 100644 erpnext/public/images/erpnext-footer.png delete mode 100644 erpnext/public/images/erpnext-logo.png delete mode 100644 erpnext/public/images/erpnext_logo.svg delete mode 100644 erpnext/public/images/favicon.png delete mode 100644 erpnext/public/images/splash.png diff --git a/erpnext/public/images/erp-icon.svg b/erpnext/public/images/erp-icon.svg deleted file mode 100644 index 6bec40cc62..0000000000 --- a/erpnext/public/images/erp-icon.svg +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="88px" height="88px" viewBox="0 0 88 88" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch --> - <title>erpnext-logo</title> - <desc>Created with Sketch.</desc> - <defs></defs> - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="erpnext-logo" transform="translate(-2.000000, -2.000000)" fill-rule="nonzero"> - <g id="g1422-7-2" transform="translate(0.025630, 0.428785)" fill="#5E64FF"> - <g id="g1418-4-6" transform="translate(0.268998, 0.867736)"> - <g id="g1416-4-9" transform="translate(0.749997, 0.000000)"> - <path d="M14.1845844,0.703479866 L75.0387175,0.703479866 C82.3677094,0.703479866 88.2679029,6.60367875 88.2679029,13.9326374 L88.2679029,74.7868158 C88.2679029,82.1157744 82.3677094,88.0159833 75.0387175,88.0159833 L14.1845844,88.0159833 C6.85569246,88.0159833 0.955398949,82.1157744 0.955398949,74.7868158 L0.955398949,13.9326374 C0.955398949,6.60367875 6.85569246,0.703479866 14.1845844,0.703479866 L14.1845844,0.703479866 Z" id="path1414-3-4"></path> - </g> - </g> - </g> - <g id="g1444-6-7" transform="translate(27.708247, 23.320960)" fill="#FFFFFF"> - <path d="M4.06942472,0.507006595 C3.79457554,0.507006595 3.52673783,0.534925429 3.26792241,0.587619847 C3.00908052,0.640314265 2.75926093,0.717948309 2.52171801,0.818098395 C2.40292009,0.868173438 2.28745592,0.924056085 2.17495509,0.985013441 C1.94997987,1.10692286 1.73828674,1.24983755 1.54244215,1.41134187 C0.661062132,2.13811791 0.100674618,3.23899362 0.100674618,4.4757567 L0.100674618,4.71760174 L0.100674618,39.9531653 L0.100674618,40.1945182 C0.100674618,42.3932057 1.87073716,44.1632683 4.06942472,44.1632683 L31.8263867,44.1632683 C34.0250742,44.1632683 35.7951368,42.3932057 35.7951368,40.1945182 L35.7951368,39.9531653 C35.7951368,37.7544777 34.0250742,35.9844152 31.8263867,35.9844152 L8.28000399,35.9844152 L8.28000399,26.0992376 L25.7874571,26.0992376 C27.9861447,26.0992376 29.7562072,24.3291751 29.7562072,22.1304875 L29.7562072,21.8891611 C29.7562072,19.6904735 27.9861447,17.920411 25.7874571,17.920411 L8.28000399,17.920411 L8.28000399,8.68635184 L31.8263867,8.68635184 C34.0250742,8.68635184 35.7951368,6.9162893 35.7951368,4.71760174 L35.7951368,4.4757567 C35.7951368,2.27706914 34.0250742,0.507006595 31.8263867,0.507006595 L4.06942472,0.507006595 Z" id="rect1436-8-4"></path> - </g> - </g> - </g> -</svg> \ No newline at end of file diff --git a/erpnext/public/images/erpnext-12.svg b/erpnext/public/images/erpnext-12.svg deleted file mode 100644 index fcc8e46fdd..0000000000 --- a/erpnext/public/images/erpnext-12.svg +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="165px" height="88px" viewBox="0 0 165 88" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch --> - <title>version-12</title> - <desc>Created with Sketch.</desc> - <defs></defs> - <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="version-12" transform="translate(-2.000000, -2.000000)"> - <g id="erp-icon" fill-rule="nonzero"> - <g id="g1422-7-2" transform="translate(0.025630, 0.428785)" fill="#5E64FF"> - <g id="g1418-4-6" transform="translate(0.268998, 0.867736)"> - <g id="g1416-4-9" transform="translate(0.749997, 0.000000)"> - <path d="M14.1845844,0.703479866 L75.0387175,0.703479866 C82.3677094,0.703479866 88.2679029,6.60367875 88.2679029,13.9326374 L88.2679029,74.7868158 C88.2679029,82.1157744 82.3677094,88.0159833 75.0387175,88.0159833 L14.1845844,88.0159833 C6.85569246,88.0159833 0.955398949,82.1157744 0.955398949,74.7868158 L0.955398949,13.9326374 C0.955398949,6.60367875 6.85569246,0.703479866 14.1845844,0.703479866 L14.1845844,0.703479866 Z" id="path1414-3-4"></path> - </g> - </g> - </g> - <g id="g1444-6-7" transform="translate(27.708247, 23.320960)" fill="#FFFFFF"> - <path d="M4.06942472,0.507006595 C3.79457554,0.507006595 3.52673783,0.534925429 3.26792241,0.587619847 C3.00908052,0.640314265 2.75926093,0.717948309 2.52171801,0.818098395 C2.40292009,0.868173438 2.28745592,0.924056085 2.17495509,0.985013441 C1.94997987,1.10692286 1.73828674,1.24983755 1.54244215,1.41134187 C0.661062132,2.13811791 0.100674618,3.23899362 0.100674618,4.4757567 L0.100674618,4.71760174 L0.100674618,39.9531653 L0.100674618,40.1945182 C0.100674618,42.3932057 1.87073716,44.1632683 4.06942472,44.1632683 L31.8263867,44.1632683 C34.0250742,44.1632683 35.7951368,42.3932057 35.7951368,40.1945182 L35.7951368,39.9531653 C35.7951368,37.7544777 34.0250742,35.9844152 31.8263867,35.9844152 L8.28000399,35.9844152 L8.28000399,26.0992376 L25.7874571,26.0992376 C27.9861447,26.0992376 29.7562072,24.3291751 29.7562072,22.1304875 L29.7562072,21.8891611 C29.7562072,19.6904735 27.9861447,17.920411 25.7874571,17.920411 L8.28000399,17.920411 L8.28000399,8.68635184 L31.8263867,8.68635184 C34.0250742,8.68635184 35.7951368,6.9162893 35.7951368,4.71760174 L35.7951368,4.4757567 C35.7951368,2.27706914 34.0250742,0.507006595 31.8263867,0.507006595 L4.06942472,0.507006595 Z" id="rect1436-8-4"></path> - </g> - </g> - <text id="12" font-family="SourceSansPro-Regular, Source Sans Pro" font-size="72" font-weight="normal" letter-spacing="-0.386831313" fill="#D1D8DD"> - <tspan x="99" y="71">12</tspan> - </text> - </g> - </g> -</svg> \ No newline at end of file diff --git a/erpnext/public/images/erpnext-footer.png b/erpnext/public/images/erpnext-footer.png deleted file mode 100644 index ffff7756b7794c22794636846f8feacddd31cb7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1937 zcmZ`)Yfw{16pmJlV)<d|bQlIT6Z;rOlA8phCWcTT2si{7gfXaCLvoR5lA9(M2)3ma zwT|yr>a(rop<-=IJ3bhTRa%P$TSpN!0umsBkOvTwKp+8>?j|U=8Ql5qW6z#%zjMys z-McR>B_Sv<G>}9h1tlf&)4_8CxWeYW2JYHIVGMZ8Ql}@xlB(~8SwLsLGBHa{A}t7p z*DTWMZ$n6=Iqyg_gt$<U%n@U9nn;4>pfrtK3A{-pu7(3%<tQ#9YveM8nxl!Lcs)4a z9hwme+3SLDkD>?#Y2-Leg_2pc<up2l7f2?PxhhF6C!N1$iVk{Flsp_)auB4ju#i?5 zNyAiI5eA#hM(9k0$)o}gs=7#li!@Y)dZ}-c7xVB@wOA!p;!;dOhVzPYuzWm<LV-dr zn=ejWnmeteP*0@=5=7t#!l2QSnP{j+`U)Bxc_mFEewmdrUnTSABoQO143(n_Tn%`P z8RbB2UlRWpq(-FliFu3Y%Z&>o=cJ=*OqLHzkg1U3JSNwhkiU7lB0g3eCReIZwHnZP ztSJi7=I<|@mf@{@p+PkI6H--Dkf{j9#bZnf5N-bcSu+U`jRXQLJts}7L1jX|6cp5( z1)I)AW*qP*#$hr{wN5D#qcAWpg<$gc_R3^U%P?0FWe5WVqD0J5=jUug#W-QLz?yl# z{aDdfgka_(GkSBum%tHV5@~J`UxcGPCY`~e(pgj{GlRk8&{>>SY%b#GLx=#5#Hmmb zj;S&*OvdwOA%|UZBrTE#7SP{gip)jeJ|gTZ-=_6i!LH>60_KYofERdQS92R2DD%>i zGve>H7#_6fh-hxnHMe#=Z0mdk@D!lyF+h8l7DBJp>7PIto^%*mIt;Cy-ECbxPXY8j z?RsOo!KgFz>biS7AWWS-<}RaIZ?x!pEd~gy!DQ_QF!%MC`;3<UUMs+WsSm(r2I#k0 zAO<Z1gH{N;)n@Or+52sd{z1op-Dz_S4FWia?9O4wkjpXbazcy@xkiRZMqLnY*Qk30 z!0j3Jc-)>b<e?*f_w%IKTvG&nBMv+H=?@VJqJrbpafdbMf?)b)i>lM%{g#*Y1KM z>67>|8Ho)8+GnY4AA|(h$DGOy8y9MCZBhIfoV8%CMR{y~iimloX@B;=qmz@V1?&H~ zQU6AEb41oB#n(2Sxn68@wx44sZFpMtR*qP3R2zOycw)uFik0uKrJk`&9<6Dkgq^zd zbHR1A*A(9HNMkCyQ~$MYS6xMZ{lX*mpsVze^Cz>oEZ6L=lX(YgPIlj0th{t$<1#bF zdZ1%|foJXW<nW3$XS2%_OGAEfH-;}R6Xc~<-iZk>zw>!~>GP(}%}uw5u1nXKR~8>1 z)T9*^9&jA`t)w6$Q+Kl}pz*#X^l+Z)t4ZxQ5BL0v34@P>|C#w-<nXcft=DR5OWs~+ zoU6NXxXuuq`e{?3i+opg`r@i&^Uj9%>*DwPbNT$D6a1LXKSea25``EgPl|U}-`pgx zk2Wp;ZZA9Kvc_Di2w1W&^rKBx4G*HX-B`bWZ}Qoc1+@|BCC7Imi@rR#b7{`^7iNc~ zR#~EIqpRi!#^)8qO!P?#z8G#C*z<dFrg@p=CN(xG&syeKEufLlUcQuDdBv!sw=Q8c zE1k7t2|G+Heu#*USY{aAoz1`aW*F`Dk8AQ;6T`}j0yIGv4|#Gw919!xdtwLAx#ZSy z>c(7V-NBwm<HgPWjrXG;f0j_?7A89Om3I8qzxsU6P9dwhyB7W@lj2kO)v;Sj{sVg8 BQ<DGy diff --git a/erpnext/public/images/erpnext-logo.png b/erpnext/public/images/erpnext-logo.png deleted file mode 100644 index 115faaa6a8f389d8324950b887e70c24acceb718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11639 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 diff --git a/erpnext/public/images/erpnext_logo.svg b/erpnext/public/images/erpnext_logo.svg deleted file mode 100644 index af3a84953b..0000000000 --- a/erpnext/public/images/erpnext_logo.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M5.45455 0H30.5454C33.5673 0 36 2.43272 36 5.45454V30.5455C36 33.5673 33.5673 36 30.5454 36H5.45455C2.43276 36 0 33.5673 0 30.5455V5.45454C0 2.43272 2.43276 0 5.45455 0Z" fill="#2996F1"/> - <path d="M12.277 8.99994C12.1637 8.99994 12.0532 9.01145 11.9465 9.03318C11.8398 9.0549 11.7368 9.08691 11.6389 9.12821C11.5899 9.14885 11.5423 9.17189 11.4959 9.19703C11.4031 9.24729 11.3158 9.30622 11.2351 9.37281C10.8717 9.67247 10.6406 10.1264 10.6406 10.6363V10.736V25.2641V25.3636C10.6406 26.2701 11.3704 26.9999 12.277 26.9999H23.7215C24.6281 26.9999 25.3579 26.2701 25.3579 25.3636V25.2641C25.3579 24.3575 24.6281 23.6277 23.7215 23.6277H14.0131V19.5519H21.2316C22.1381 19.5519 22.868 18.8221 22.868 17.9156V17.8161C22.868 16.9095 22.1381 16.1797 21.2316 16.1797H14.0131V12.3724H23.7215C24.6281 12.3724 25.3579 11.6426 25.3579 10.736V10.6363C25.3579 9.72976 24.6281 8.99994 23.7215 8.99994H12.277Z" fill="white"/> -</svg> \ No newline at end of file diff --git a/erpnext/public/images/favicon.png b/erpnext/public/images/favicon.png deleted file mode 100644 index b6948856f88b93a5de936e256b09845680fa0ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1696 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 diff --git a/erpnext/public/images/splash.png b/erpnext/public/images/splash.png deleted file mode 100644 index 8e5d055c660ab4f316cc1cb3f7b6e9f7dd2f4a7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10615 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 a;FvxakH}_neuKx15#*$lCCk4U1^yqOq<=I3 From fd0e8a4e2320ae65dfb058ad9d72cf55f8ec8304 Mon Sep 17 00:00:00 2001 From: prssanna <prssud@gmail.com> Date: Wed, 10 Feb 2021 16:31:41 +0530 Subject: [PATCH 25/27] fix: also fetch item variants if hide variants is disabled --- erpnext/shopping_cart/product_query.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/shopping_cart/product_query.py b/erpnext/shopping_cart/product_query.py index 8daf3d7dac..36d446ed0f 100644 --- a/erpnext/shopping_cart/product_query.py +++ b/erpnext/shopping_cart/product_query.py @@ -23,8 +23,10 @@ class ProductQuery: self.cart_settings = frappe.get_doc("Shopping Cart Settings") self.page_length = self.settings.products_per_page or 20 self.fields = ['name', 'item_name', 'item_code', 'website_image', 'variant_of', 'has_variants', 'item_group', 'image', 'web_long_description', 'description', 'route'] - self.filters = [['show_in_website', '=', 1]] - self.or_filters = [] + self.filters = [] + self.or_filters = [['show_in_website', '=', 1]] + if not self.settings.get('hide_variants'): + self.or_filters.append(['show_variant_in_website', '=', 1]) def query(self, attributes=None, fields=None, search_term=None, start=0): """Summary From 3237f5bb88d5a60e7c0a75289d652c24cf2fa10c Mon Sep 17 00:00:00 2001 From: Rucha Mahabal <ruchamahabal2@gmail.com> Date: Wed, 10 Feb 2021 16:36:49 +0530 Subject: [PATCH 26/27] fix: Inpatient Medication Orders report test (#24596) --- .../doctype/inpatient_record/test_inpatient_record.py | 2 +- .../test_inpatient_medication_orders.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py index ea0d1e982d..a8c7720a0a 100644 --- a/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py +++ b/erpnext/healthcare/doctype/inpatient_record/test_inpatient_record.py @@ -145,7 +145,7 @@ def create_inpatient(patient): def get_healthcare_service_unit(unit_name=None): if not unit_name: - service_unit = get_random("Healthcare Service Unit", filters={"inpatient_occupancy": 1}) + service_unit = get_random("Healthcare Service Unit", filters={"inpatient_occupancy": 1, "company": "_Test Company"}) else: service_unit = frappe.db.exists("Healthcare Service Unit", {"healthcare_service_unit_name": unit_name}) diff --git a/erpnext/healthcare/report/inpatient_medication_orders/test_inpatient_medication_orders.py b/erpnext/healthcare/report/inpatient_medication_orders/test_inpatient_medication_orders.py index 0d3f45f500..4b461f1a97 100644 --- a/erpnext/healthcare/report/inpatient_medication_orders/test_inpatient_medication_orders.py +++ b/erpnext/healthcare/report/inpatient_medication_orders/test_inpatient_medication_orders.py @@ -119,7 +119,7 @@ def create_records(patient): ip_record.expected_length_of_stay = 0 ip_record.save() ip_record.reload() - service_unit = get_healthcare_service_unit() + service_unit = get_healthcare_service_unit('Test Service Unit Ip Occupancy') admit_patient(ip_record, service_unit, now_datetime()) ipmo = create_ipmo(patient) From 7b2afaf3497615599d74c294722c919dca801a85 Mon Sep 17 00:00:00 2001 From: Saqib <nextchamp.saqib@gmail.com> Date: Wed, 10 Feb 2021 17:21:12 +0530 Subject: [PATCH 27/27] fix: NoneType has no len() (#24600) --- erpnext/regional/india/e_invoice/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index e64be4b645..5f701f2aa6 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -23,7 +23,7 @@ def validate_einvoice_fields(doc): invalid_doctype = doc.doctype != 'Sales Invoice' invalid_supply_type = doc.get('gst_category') not in ['Registered Regular', 'SEZ', 'Overseas', 'Deemed Export'] company_transaction = doc.get('billing_address_gstin') == doc.get('company_gstin') - no_taxes_applied = len(doc.get('taxes')) == 0 + no_taxes_applied = len(doc.get('taxes', [])) == 0 if not einvoicing_enabled or invalid_doctype or invalid_supply_type or company_transaction or no_taxes_applied: return