From 4620ed6e4231965885c8e3c519e2686cee278628 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 14 May 2023 16:54:56 +0530 Subject: [PATCH 01/19] refactor: replace join with sub-query for fetching accounts (cherry picked from commit e6a9252f79e1288c5d4b8f4a9989bfd5354c747b) --- .../period_closing_voucher/period_closing_voucher.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py index 866a94d04b1..46e2c50e40b 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py +++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py @@ -169,21 +169,18 @@ class PeriodClosingVoucher(AccountsController): return frappe.db.sql( """ select - t2.account_currency, + t1.account_currency, {dimension_fields}, sum(t1.debit_in_account_currency) - sum(t1.credit_in_account_currency) as bal_in_account_currency, sum(t1.debit) - sum(t1.credit) as bal_in_company_currency - from `tabGL Entry` t1, `tabAccount` t2 + from `tabGL Entry` t1 where t1.is_cancelled = 0 - and t1.account = t2.name - and t2.report_type = 'Profit and Loss' - and t2.docstatus < 2 - and t2.company = %s + and t1.account in (select name from `tabAccount` where report_type = 'Profit and Loss' and docstatus < 2 and company = %s) and t1.posting_date between %s and %s group by {dimension_fields} """.format( - dimension_fields=", ".join(dimension_fields) + dimension_fields=", ".join(dimension_fields), ), (self.company, self.get("year_start_date"), self.posting_date), as_dict=1, From b10dfba93156ede256ecc73e787c3ad6b4c2cfec Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Wed, 31 May 2023 14:38:37 +0530 Subject: [PATCH 02/19] chore: remove whitelisting for method not accessed from UI (cherry picked from commit 517d8a03ec8e4b9e3767dd2c48eca22baef9112b) --- erpnext/assets/doctype/asset_category/asset_category.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index a4d2c82845a..2e1def98fc3 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -96,7 +96,6 @@ class AssetCategory(Document): frappe.throw(msg, title=_("Missing Account")) -@frappe.whitelist() def get_asset_category_account( fieldname, item=None, asset=None, account=None, asset_category=None, company=None ): From 5ba5fb1b1c7efc04a85296d0b6e9f0062b535076 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 16:37:52 +0530 Subject: [PATCH 03/19] fix(ux): throw if no row selected to create repost entries (backport #35503) (#35504) fix(ux): throw if no row selected to create repost entries (cherry picked from commit 1905239ec251df473b1c32b848c824184f7d86fc) Co-authored-by: s-aga-r --- .../stock_and_account_value_comparison.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js index 50a78a82588..254f5273be2 100644 --- a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js +++ b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js @@ -53,11 +53,14 @@ frappe.query_reports["Stock and Account Value Comparison"] = {

Are you sure you want to create Reposting Entries?

`; + let indexes = frappe.query_report.datatable.rowmanager.getCheckedRows(); + let selected_rows = indexes.map(i => frappe.query_report.data[i]); + + if (!selected_rows.length) { + frappe.throw(__("Please select rows to create Reposting Entries")); + } frappe.confirm(__(message), () => { - let indexes = frappe.query_report.datatable.rowmanager.getCheckedRows(); - let selected_rows = indexes.map(i => frappe.query_report.data[i]); - frappe.call({ method: "erpnext.stock.report.stock_and_account_value_comparison.stock_and_account_value_comparison.create_reposting_entries", args: { From 841d2e4b2c94a478d14a4a851608697a1f2bbdf1 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 31 May 2023 16:51:54 +0530 Subject: [PATCH 04/19] refactor: Workspace cleanup (backport #35409) (#35505) * refactor: Workspace cleanup (cherry picked from commit 243c49c5506ad11608009d0adf561883a7a5356e) # Conflicts: # erpnext/accounts/workspace/accounting/accounting.json # erpnext/assets/workspace/assets/assets.json * fix: Delete Retail and Utilities worspaces amd hide default Settings and Integration workspaces (cherry picked from commit 0b28f641add5b804a4b576ef1e80bb31e497cc93) * fix: Added pos links in Selling workspace (cherry picked from commit 86f88817a9b300b783c4d7b5fa9ba883f105b6e5) * fix: removed duplicate links of manufacturing workspace (cherry picked from commit 5cf4c8c8b7c6586d891ac46be8d7b942604e3a34) * fix: Rearranged accounting module links (cherry picked from commit e78a7de1e5ba21b0176f23aaa7c1ea0507bfc383) # Conflicts: # erpnext/accounts/workspace/accounting/accounting.json * chore: typo (cherry picked from commit bb67cc03df67adf129aee1c9f766ad041c0c1089) * chore: conflicts --------- Co-authored-by: Nabin Hait Co-authored-by: Ankush Menat Co-authored-by: Ankush Menat --- .../workspace/accounting/accounting.json | 6 +- erpnext/assets/workspace/assets/assets.json | 10 +- erpnext/buying/workspace/buying/buying.json | 8 +- .../linkedin_settings/linkedin_settings.js | 8 +- .../twitter_settings/twitter_settings.js | 2 +- erpnext/crm/workspace/crm/crm.json | 333 ++++++------ .../erpnext_integrations.json | 208 +++++++- .../workspace/loans/loans.json | 6 +- .../manufacturing/manufacturing.json | 109 +--- erpnext/patches.txt | 1 + erpnext/patches/v14_0/cleanup_workspaces.py | 9 + .../projects/workspace/projects/projects.json | 7 +- .../workspace/quality/quality.json | 8 +- erpnext/selling/workspace/retail/retail.json | 123 ----- .../selling/workspace/selling/selling.json | 167 ++---- erpnext/setup/install.py | 6 + .../erpnext_settings/erpnext_settings.json | 495 ++++++++++++++++-- erpnext/setup/workspace/home/home.json | 7 +- erpnext/stock/workspace/stock/stock.json | 7 +- .../support/workspace/support/support.json | 10 +- .../workspace/utilities/utilities.json | 55 -- 21 files changed, 925 insertions(+), 660 deletions(-) create mode 100644 erpnext/patches/v14_0/cleanup_workspaces.py delete mode 100644 erpnext/selling/workspace/retail/retail.json delete mode 100644 erpnext/utilities/workspace/utilities/utilities.json diff --git a/erpnext/accounts/workspace/accounting/accounting.json b/erpnext/accounts/workspace/accounting/accounting.json index b0c112494d6..511ba82cc95 100644 --- a/erpnext/accounts/workspace/accounting/accounting.json +++ b/erpnext/accounts/workspace/accounting/accounting.json @@ -5,8 +5,9 @@ "label": "Profit and Loss" } ], - "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Accounts\",\"col\":12}},{\"type\":\"chart\",\"data\":{\"chart_name\":\"Profit and Loss\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Chart of Accounts\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Invoice\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Journal Entry\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Payment Entry\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Receivable\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"General Ledger\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trial Balance\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Accounting Masters\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"General Ledger\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Receivable\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Payable\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Financial Statements\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Multi Currency\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Bank Statement\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Subscription Management\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Share Management\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Cost Center and Budgeting\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Opening and Closing\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Taxes\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Profitability\",\"col\":4}}]", + "content": "[{\"id\":\"MmUf9abwxg\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Accounts\",\"col\":12}},{\"id\":\"i0EtSjDAXq\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Profit and Loss\",\"col\":12}},{\"id\":\"X78jcbq1u3\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"vikWSkNm6_\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"pMywM0nhlj\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Chart of Accounts\",\"col\":3}},{\"id\":\"_pRdD6kqUG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"id\":\"G984SgVRJN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Invoice\",\"col\":3}},{\"id\":\"1ArNvt9qhz\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Journal Entry\",\"col\":3}},{\"id\":\"F9f4I1viNr\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Payment Entry\",\"col\":3}},{\"id\":\"4IBBOIxfqW\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Receivable\",\"col\":3}},{\"id\":\"El2anpPaFY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"General Ledger\",\"col\":3}},{\"id\":\"1nwcM9upJo\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trial Balance\",\"col\":3}},{\"id\":\"OF9WOi1Ppc\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"B7-uxs8tkU\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"tHb3yxthkR\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"DnNtsmxpty\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounting Masters\",\"col\":4}},{\"id\":\"nKKr6fjgjb\",\"type\":\"card\",\"data\":{\"card_name\":\"General Ledger\",\"col\":4}},{\"id\":\"xOHTyD8b5l\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Receivable\",\"col\":4}},{\"id\":\"_Cb7C8XdJJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Payable\",\"col\":4}},{\"id\":\"p7NY6MHe2Y\",\"type\":\"card\",\"data\":{\"card_name\":\"Financial Statements\",\"col\":4}},{\"id\":\"KlqilF5R_V\",\"type\":\"card\",\"data\":{\"card_name\":\"Taxes\",\"col\":4}},{\"id\":\"jTUy8LB0uw\",\"type\":\"card\",\"data\":{\"card_name\":\"Cost Center and Budgeting\",\"col\":4}},{\"id\":\"Wn2lhs7WLn\",\"type\":\"card\",\"data\":{\"card_name\":\"Multi Currency\",\"col\":4}},{\"id\":\"PAQMqqNkBM\",\"type\":\"card\",\"data\":{\"card_name\":\"Bank Statement\",\"col\":4}},{\"id\":\"Q_hBCnSeJY\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"3AK1Zf0oew\",\"type\":\"card\",\"data\":{\"card_name\":\"Profitability\",\"col\":4}},{\"id\":\"kxhoaiqdLq\",\"type\":\"card\",\"data\":{\"card_name\":\"Opening and Closing\",\"col\":4}},{\"id\":\"q0MAlU2j_Z\",\"type\":\"card\",\"data\":{\"card_name\":\"Subscription Management\",\"col\":4}},{\"id\":\"ptm7T6Hwu-\",\"type\":\"card\",\"data\":{\"card_name\":\"Share Management\",\"col\":4}},{\"id\":\"OX7lZHbiTr\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", "creation": "2020-03-02 15:41:59.515192", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", @@ -1093,10 +1094,11 @@ "type": "Link" } ], - "modified": "2022-06-24 05:41:09.236458", + "modified": "2023-05-30 13:23:29.316711", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, diff --git a/erpnext/assets/workspace/assets/assets.json b/erpnext/assets/workspace/assets/assets.json index 9d6080e94e8..d810effda00 100644 --- a/erpnext/assets/workspace/assets/assets.json +++ b/erpnext/assets/workspace/assets/assets.json @@ -7,12 +7,14 @@ ], "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Assets\",\"col\":12}},{\"type\":\"chart\",\"data\":{\"chart_name\":\"Asset Value Analytics\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Asset\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Asset Category\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Fixed Asset Register\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Assets\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Maintenance\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}}]", "creation": "2020-03-02 15:43:27.634865", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "assets", "idx": 0, + "is_hidden": 0, "label": "Assets", "links": [ { @@ -183,13 +185,15 @@ "type": "Link" } ], - "modified": "2021-10-04 12:15:54.839454", + "modified": "2023-05-24 14:47:20.243146", "modified_by": "Administrator", "module": "Assets", "name": "Assets", + "number_cards": [], "owner": "Administrator", - "parent_page": "", + "parent_page": "Accounting", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], "sequence_id": 4.0, @@ -216,4 +220,4 @@ } ], "title": "Assets" -} +} \ No newline at end of file diff --git a/erpnext/buying/workspace/buying/buying.json b/erpnext/buying/workspace/buying/buying.json index 5ad93f0e594..58c8f747106 100644 --- a/erpnext/buying/workspace/buying/buying.json +++ b/erpnext/buying/workspace/buying/buying.json @@ -7,12 +7,14 @@ ], "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Buying\",\"col\":12}},{\"type\":\"chart\",\"data\":{\"chart_name\":\"Purchase Order Trends\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Material Request\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Order\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Analytics\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Order Analysis\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Buying\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Items & Pricing\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Supplier\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Supplier Scorecard\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Key Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Regional\",\"col\":4}}]", "creation": "2020-01-28 11:50:26.195467", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "buying", "idx": 0, + "is_hidden": 0, "label": "Buying", "links": [ { @@ -509,16 +511,18 @@ "type": "Link" } ], - "modified": "2022-01-13 17:26:39.090190", + "modified": "2023-05-24 14:47:20.535772", "modified_by": "Administrator", "module": "Buying", "name": "Buying", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 6.0, + "sequence_id": 5.0, "shortcuts": [ { "color": "Green", diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js index d532236b7d2..7d6b3955cde 100644 --- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js +++ b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js @@ -5,7 +5,7 @@ frappe.ui.form.on('LinkedIn Settings', { onload: function(frm) { if (frm.doc.session_status == 'Expired' && frm.doc.consumer_key && frm.doc.consumer_secret) { frappe.confirm( - __('Session not valid, Do you want to login?'), + __('Session not valid. Do you want to login?'), function(){ frm.trigger("login"); }, @@ -14,11 +14,11 @@ frappe.ui.form.on('LinkedIn Settings', { } ); } - frm.dashboard.set_headline(__("For more information, {0}.", [`${__('Click here')}`])); + frm.dashboard.set_headline(__("For more information, {0}.", [`${__('click here')}`])); }, refresh: function(frm) { if (frm.doc.session_status=="Expired"){ - let msg = __("Session Not Active. Save doc to login."); + let msg = __("Session not active. Save document to login."); frm.dashboard.set_headline_alert( `
@@ -37,7 +37,7 @@ frappe.ui.form.on('LinkedIn Settings', { let msg,color; if (days>0){ - msg = __("Your Session will be expire in {0} days.", [days]); + msg = __("Your session will be expire in {0} days.", [days]); color = "green"; } else { diff --git a/erpnext/crm/doctype/twitter_settings/twitter_settings.js b/erpnext/crm/doctype/twitter_settings/twitter_settings.js index 112f3d4d1c3..c322092d6f3 100644 --- a/erpnext/crm/doctype/twitter_settings/twitter_settings.js +++ b/erpnext/crm/doctype/twitter_settings/twitter_settings.js @@ -14,7 +14,7 @@ frappe.ui.form.on('Twitter Settings', { } ); } - frm.dashboard.set_headline(__("For more information, {0}.", [`${__('Click here')}`])); + frm.dashboard.set_headline(__("For more information, {0}.", [`${__('click here')}`])); }, refresh: function(frm) { let msg, color, flag=false; diff --git a/erpnext/crm/workspace/crm/crm.json b/erpnext/crm/workspace/crm/crm.json index 318754baffc..b107df76f8f 100644 --- a/erpnext/crm/workspace/crm/crm.json +++ b/erpnext/crm/workspace/crm/crm.json @@ -5,177 +5,18 @@ "label": "Territory Wise Sales" } ], - "content": "[{\"type\":\"chart\",\"data\":{\"chart_name\":\"Territory Wise Sales\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Lead\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Opportunity\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Customer\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Analytics\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Sales Pipeline\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Campaign\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Maintenance\",\"col\":4}}]", + "content": "[{\"id\":\"Cj2TyhgiWy\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Territory Wise Sales\",\"col\":12}},{\"id\":\"LAKRmpYMRA\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"XGIwEUStw_\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"69RN0XsiJK\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Lead\",\"col\":3}},{\"id\":\"t6PQ0vY-Iw\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Opportunity\",\"col\":3}},{\"id\":\"VOFE0hqXRD\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Customer\",\"col\":3}},{\"id\":\"0ik53fuemG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Analytics\",\"col\":3}},{\"id\":\"wdROEmB_XG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"-I9HhcgUKE\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"ttpROKW9vk\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"-76QPdbBHy\",\"type\":\"card\",\"data\":{\"card_name\":\"Sales Pipeline\",\"col\":4}},{\"id\":\"_YmGwzVWRr\",\"type\":\"card\",\"data\":{\"card_name\":\"Masters\",\"col\":4}},{\"id\":\"Bma1PxoXk3\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"80viA0R83a\",\"type\":\"card\",\"data\":{\"card_name\":\"Campaign\",\"col\":4}},{\"id\":\"Buo5HtKRFN\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"id\":\"sLS_x4FMK2\",\"type\":\"card\",\"data\":{\"card_name\":\"Maintenance\",\"col\":4}}]", "creation": "2020-01-23 14:48:30.183272", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "crm", "idx": 0, + "is_hidden": 0, "label": "CRM", "links": [ - { - "hidden": 0, - "is_query_report": 0, - "label": "Sales Pipeline", - "link_count": 0, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Lead", - "link_count": 0, - "link_to": "Lead", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Opportunity", - "link_count": 0, - "link_to": "Opportunity", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Prospect", - "link_count": 0, - "link_to": "Prospect", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Customer", - "link_count": 0, - "link_to": "Customer", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Contact", - "link_count": 0, - "link_to": "Contact", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Communication", - "link_count": 0, - "link_to": "Communication", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Contract", - "link_count": 0, - "link_to": "Contract", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Appointment", - "link_count": 0, - "link_to": "Appointment", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Newsletter", - "link_count": 0, - "link_to": "Newsletter", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Lead Source", - "link_count": 0, - "link_to": "Lead Source", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Territory", - "link_count": 0, - "link_to": "Territory", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Customer Group", - "link_count": 0, - "link_to": "Customer Group", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Sales Person", - "link_count": 0, - "link_to": "Sales Person", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Sales Stage", - "link_count": 0, - "link_to": "Sales Stage", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, { "hidden": 0, "is_query_report": 0, @@ -446,19 +287,183 @@ "link_type": "DocType", "onboard": 0, "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Masters", + "link_count": 7, + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Territory", + "link_count": 0, + "link_to": "Territory", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Customer Group", + "link_count": 0, + "link_to": "Customer Group", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Contact", + "link_count": 0, + "link_to": "Contact", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Prospect", + "link_count": 0, + "link_to": "Prospect", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Sales Person", + "link_count": 0, + "link_to": "Sales Person", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Sales Stage", + "link_count": 0, + "link_to": "Sales Stage", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Lead Source", + "link_count": 0, + "link_to": "Lead Source", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Sales Pipeline", + "link_count": 7, + "onboard": 0, + "type": "Card Break" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Lead", + "link_count": 0, + "link_to": "Lead", + "link_type": "DocType", + "onboard": 1, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Opportunity", + "link_count": 0, + "link_to": "Opportunity", + "link_type": "DocType", + "onboard": 1, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Customer", + "link_count": 0, + "link_to": "Customer", + "link_type": "DocType", + "onboard": 1, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Contract", + "link_count": 0, + "link_to": "Contract", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Appointment", + "link_count": 0, + "link_to": "Appointment", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Newsletter", + "link_count": 0, + "link_to": "Newsletter", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Communication", + "link_count": 0, + "link_to": "Communication", + "link_type": "DocType", + "onboard": 0, + "type": "Link" } ], - "modified": "2022-07-22 15:03:30.755417", + "modified": "2023-05-26 16:49:04.298122", "modified_by": "Administrator", "module": "CRM", "name": "CRM", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 7.0, + "sequence_id": 10.0, "shortcuts": [ { "color": "Blue", diff --git a/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json b/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json index 1f2619b9a6e..ccc46b7a220 100644 --- a/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json +++ b/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json @@ -1,30 +1,185 @@ { "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Marketplace\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Payments\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", + "content": "[{\"id\":\"e88ADOJ7WC\",\"type\":\"header\",\"data\":{\"text\":\"Integrations\",\"col\":12}},{\"id\":\"G0tyx9WOfm\",\"type\":\"card\",\"data\":{\"card_name\":\"Backup\",\"col\":4}},{\"id\":\"nu4oSjH5Rd\",\"type\":\"card\",\"data\":{\"card_name\":\"Authentication\",\"col\":4}},{\"id\":\"nG8cdkpzoc\",\"type\":\"card\",\"data\":{\"card_name\":\"Google Services\",\"col\":4}},{\"id\":\"4hwuQn6E95\",\"type\":\"card\",\"data\":{\"card_name\":\"Communication Channels\",\"col\":4}},{\"id\":\"sEGAzTJRmq\",\"type\":\"card\",\"data\":{\"card_name\":\"Payments\",\"col\":4}},{\"id\":\"ZC6xu-cLBR\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", "creation": "2020-08-20 19:30:48.138801", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "integration", "idx": 0, + "is_hidden": 0, "label": "ERPNext Integrations", "links": [ { "hidden": 0, "is_query_report": 0, - "label": "Marketplace", - "link_count": 0, + "label": "Backup", + "link_count": 3, "onboard": 0, "type": "Card Break" }, { - "dependencies": "", "hidden": 0, "is_query_report": 0, - "label": "Woocommerce Settings", + "label": "Dropbox Settings", "link_count": 0, - "link_to": "Woocommerce Settings", + "link_to": "Dropbox Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "S3 Backup Settings", + "link_count": 0, + "link_to": "S3 Backup Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Google Drive", + "link_count": 0, + "link_to": "Google Drive", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Authentication", + "link_count": 4, + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Social Login", + "link_count": 0, + "link_to": "Social Login Key", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "LDAP Settings", + "link_count": 0, + "link_to": "LDAP Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "OAuth Client", + "link_count": 0, + "link_to": "OAuth Client", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "OAuth Provider Settings", + "link_count": 0, + "link_to": "OAuth Provider Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Communication Channels", + "link_count": 3, + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Webhook", + "link_count": 0, + "link_to": "Webhook", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "SMS Settings", + "link_count": 0, + "link_to": "SMS Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Slack Webhook URL", + "link_count": 0, + "link_to": "Slack Webhook URL", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Google Services", + "link_count": 4, + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Google Settings", + "link_count": 0, + "link_to": "Google Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Google Contacts", + "link_count": 0, + "link_to": "Google Contacts", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Google Calendar", + "link_count": 0, + "link_to": "Google Calendar", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Google Drive", + "link_count": 0, + "link_to": "Google Drive", "link_type": "DocType", "onboard": 0, "type": "Link" @@ -33,12 +188,11 @@ "hidden": 0, "is_query_report": 0, "label": "Payments", - "link_count": 0, + "link_count": 3, "onboard": 0, "type": "Card Break" }, { - "dependencies": "", "hidden": 0, "is_query_report": 0, "label": "GoCardless Settings", @@ -49,10 +203,9 @@ "type": "Link" }, { - "dependencies": "", "hidden": 0, "is_query_report": 0, - "label": "M-Pesa Settings", + "label": "Mpesa Settings", "link_count": 0, "link_to": "Mpesa Settings", "link_type": "DocType", @@ -60,15 +213,6 @@ "type": "Link" }, { - "hidden": 0, - "is_query_report": 0, - "label": "Settings", - "link_count": 0, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", "hidden": 0, "is_query_report": 0, "label": "Plaid Settings", @@ -78,6 +222,14 @@ "onboard": 0, "type": "Link" }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Settings", + "link_count": 2, + "onboard": 0, + "type": "Card Break" + }, { "dependencies": "", "hidden": 0, @@ -88,18 +240,30 @@ "link_type": "DocType", "onboard": 0, "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Woocommerce Settings", + "link_count": 0, + "link_to": "Woocommerce Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" } ], - "modified": "2022-01-13 17:35:35.508718", + "modified": "2023-05-24 14:47:25.984717", "modified_by": "Administrator", "module": "ERPNext Integrations", "name": "ERPNext Integrations", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 10.0, + "sequence_id": 21.0, "shortcuts": [], "title": "ERPNext Integrations" -} +} \ No newline at end of file diff --git a/erpnext/loan_management/workspace/loans/loans.json b/erpnext/loan_management/workspace/loans/loans.json index c65be4efae9..c25f4d35d0b 100644 --- a/erpnext/loan_management/workspace/loans/loans.json +++ b/erpnext/loan_management/workspace/loans/loans.json @@ -2,6 +2,7 @@ "charts": [], "content": "[{\"id\":\"_38WStznya\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"t7o_K__1jB\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Loan Application\",\"col\":3}},{\"id\":\"IRiNDC6w1p\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Loan\",\"col\":3}},{\"id\":\"xbbo0FYbq0\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"7ZL4Bro-Vi\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yhyioTViZ3\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"oYFn4b1kSw\",\"type\":\"card\",\"data\":{\"card_name\":\"Loan\",\"col\":4}},{\"id\":\"vZepJF5tl9\",\"type\":\"card\",\"data\":{\"card_name\":\"Loan Processes\",\"col\":4}},{\"id\":\"k-393Mjhqe\",\"type\":\"card\",\"data\":{\"card_name\":\"Disbursement and Repayment\",\"col\":4}},{\"id\":\"6crJ0DBiBJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Loan Security\",\"col\":4}},{\"id\":\"Um5YwxVLRJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}}]", "creation": "2020-03-12 16:35:55.299820", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", @@ -279,17 +280,18 @@ "type": "Link" } ], - "modified": "2023-01-31 19:47:13.114415", + "modified": "2023-05-24 14:47:24.109945", "modified_by": "Administrator", "module": "Loan Management", "name": "Loans", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 16.0, + "sequence_id": 15.0, "shortcuts": [ { "color": "Green", diff --git a/erpnext/manufacturing/workspace/manufacturing/manufacturing.json b/erpnext/manufacturing/workspace/manufacturing/manufacturing.json index c25f606060f..d862c349e3d 100644 --- a/erpnext/manufacturing/workspace/manufacturing/manufacturing.json +++ b/erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -1,13 +1,15 @@ { "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Plan\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Work Order\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Job Card\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Forecasting\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM Stock Report\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Planning Report\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Production\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Bill of Materials\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Tools\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", + "content": "[{\"id\":\"csBCiDglCE\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"xit0dg7KvY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM\",\"col\":3}},{\"id\":\"LRhGV9GAov\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Plan\",\"col\":3}},{\"id\":\"69KKosI6Hg\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Work Order\",\"col\":3}},{\"id\":\"PwndxuIpB3\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Job Card\",\"col\":3}},{\"id\":\"OaiDqTT03Y\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Forecasting\",\"col\":3}},{\"id\":\"OtMcArFRa5\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM Stock Report\",\"col\":3}},{\"id\":\"76yYsI5imF\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Planning Report\",\"col\":3}},{\"id\":\"bN_6tHS-Ct\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yVEFZMqVwd\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"rwrmsTI58-\",\"type\":\"card\",\"data\":{\"card_name\":\"Production\",\"col\":4}},{\"id\":\"6dnsyX-siZ\",\"type\":\"card\",\"data\":{\"card_name\":\"Bill of Materials\",\"col\":4}},{\"id\":\"CIq-v5f5KC\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"8RRiQeYr0G\",\"type\":\"card\",\"data\":{\"card_name\":\"Tools\",\"col\":4}},{\"id\":\"Pu8z7-82rT\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", "creation": "2020-03-02 17:11:37.032604", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "organization", "idx": 0, + "is_hidden": 0, "label": "Manufacturing", "links": [ { @@ -243,7 +245,7 @@ "hidden": 0, "is_query_report": 0, "label": "Bill of Materials", - "link_count": 15, + "link_count": 6, "onboard": 0, "type": "Card Break" }, @@ -312,117 +314,20 @@ "link_type": "DocType", "onboard": 0, "type": "Link" - }, - { - "dependencies": "Work Order", - "hidden": 0, - "is_query_report": 1, - "label": "Production Planning Report", - "link_count": 0, - "link_to": "Production Planning Report", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Quality Inspection", - "hidden": 0, - "is_query_report": 1, - "label": "Work Order Summary", - "link_count": 0, - "link_to": "Work Order Summary", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Downtime Entry", - "hidden": 0, - "is_query_report": 1, - "label": "Quality Inspection Summary", - "link_count": 0, - "link_to": "Quality Inspection Summary", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Job Card", - "hidden": 0, - "is_query_report": 1, - "label": "Downtime Analysis", - "link_count": 0, - "link_to": "Downtime Analysis", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "BOM", - "hidden": 0, - "is_query_report": 1, - "label": "Job Card Summary", - "link_count": 0, - "link_to": "Job Card Summary", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "BOM", - "hidden": 0, - "is_query_report": 1, - "label": "BOM Search", - "link_count": 0, - "link_to": "BOM Search", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Work Order", - "hidden": 0, - "is_query_report": 1, - "label": "BOM Stock Report", - "link_count": 0, - "link_to": "BOM Stock Report", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "BOM", - "hidden": 0, - "is_query_report": 1, - "label": "Production Analytics", - "link_count": 0, - "link_to": "Production Analytics", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "BOM Operations Time", - "link_count": 0, - "link_to": "BOM Operations Time", - "link_type": "Report", - "onboard": 0, - "type": "Link" } ], - "modified": "2022-11-14 14:53:34.616862", + "modified": "2023-05-27 16:41:04.776115", "modified_by": "Administrator", "module": "Manufacturing", "name": "Manufacturing", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 17.0, + "sequence_id": 8.0, "shortcuts": [ { "color": "Grey", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index fbfb7d2094e..a2c5ca9b893 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -332,3 +332,4 @@ execute:frappe.db.set_single_value("Accounts Settings", "merge_similar_account_h erpnext.patches.v14_0.migrate_gl_to_payment_ledger erpnext.patches.v14_0.update_company_in_ldc erpnext.patches.v14_0.set_packed_qty_in_draft_delivery_notes +erpnext.patches.v14_0.cleanup_workspaces diff --git a/erpnext/patches/v14_0/cleanup_workspaces.py b/erpnext/patches/v14_0/cleanup_workspaces.py new file mode 100644 index 00000000000..2fc0a4f7d80 --- /dev/null +++ b/erpnext/patches/v14_0/cleanup_workspaces.py @@ -0,0 +1,9 @@ +import frappe + + +def execute(): + for ws in ["Retail", "Utilities"]: + frappe.delete_doc_if_exists("Workspace", ws) + + for ws in ["Integrations", "Settings"]: + frappe.db.set_value("Workspace", ws, "public", 0) diff --git a/erpnext/projects/workspace/projects/projects.json b/erpnext/projects/workspace/projects/projects.json index 4bdb1db387d..50730bac0db 100644 --- a/erpnext/projects/workspace/projects/projects.json +++ b/erpnext/projects/workspace/projects/projects.json @@ -7,12 +7,14 @@ ], "content": "[{\"type\":\"chart\",\"data\":{\"chart_name\":\"Open Projects\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Task\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Project\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Timesheet\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Project Billing Summary\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Projects\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Time Tracking\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]", "creation": "2020-03-02 15:46:04.874669", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "project", "idx": 0, + "is_hidden": 0, "label": "Projects", "links": [ { @@ -190,17 +192,18 @@ "type": "Link" } ], - "modified": "2022-10-11 22:39:10.436311", + "modified": "2023-05-24 14:47:23.179860", "modified_by": "Administrator", "module": "Projects", "name": "Projects", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 20.0, + "sequence_id": 11.0, "shortcuts": [ { "color": "Blue", diff --git a/erpnext/quality_management/workspace/quality/quality.json b/erpnext/quality_management/workspace/quality/quality.json index 3effd59d8ee..8183de9595c 100644 --- a/erpnext/quality_management/workspace/quality/quality.json +++ b/erpnext/quality_management/workspace/quality/quality.json @@ -2,12 +2,14 @@ "charts": [], "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Quality Goal\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Quality Procedure\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Quality Inspection\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Quality Review\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Quality Action\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Non Conformance\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Goal and Procedure\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Feedback\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Meeting\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Review and Action\",\"col\":4}}]", "creation": "2020-03-02 15:49:28.632014", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "quality", "idx": 0, + "is_hidden": 0, "label": "Quality", "links": [ { @@ -142,16 +144,18 @@ "type": "Link" } ], - "modified": "2022-01-13 17:42:20.105187", + "modified": "2023-05-24 14:47:22.597974", "modified_by": "Administrator", "module": "Quality Management", "name": "Quality", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 21.0, + "sequence_id": 9.0, "shortcuts": [ { "color": "Grey", diff --git a/erpnext/selling/workspace/retail/retail.json b/erpnext/selling/workspace/retail/retail.json deleted file mode 100644 index 5bce3ca648a..00000000000 --- a/erpnext/selling/workspace/retail/retail.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Point Of Sale\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings & Configurations\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Loyalty Program\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Opening & Closing\",\"col\":4}}]", - "creation": "2020-03-02 17:18:32.505616", - "docstatus": 0, - "doctype": "Workspace", - "for_user": "", - "hide_custom": 0, - "icon": "retail", - "idx": 0, - "label": "Retail", - "links": [ - { - "hidden": 0, - "is_query_report": 0, - "label": "Settings & Configurations", - "link_count": 2, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Point-of-Sale Profile", - "link_count": 0, - "link_to": "POS Profile", - "link_type": "DocType", - "onboard": 1, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "POS Settings", - "link_count": 0, - "link_to": "POS Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Loyalty Program", - "link_count": 2, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Loyalty Program", - "link_count": 0, - "link_to": "Loyalty Program", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Loyalty Point Entry", - "link_count": 0, - "link_to": "Loyalty Point Entry", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Opening & Closing", - "link_count": 2, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "POS Opening Entry", - "link_count": 0, - "link_to": "POS Opening Entry", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "POS Closing Entry", - "link_count": 0, - "link_to": "POS Closing Entry", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - } - ], - "modified": "2022-01-13 18:07:56.711095", - "modified_by": "Administrator", - "module": "Selling", - "name": "Retail", - "owner": "Administrator", - "parent_page": "", - "public": 1, - "restrict_to_domain": "Retail", - "roles": [], - "sequence_id": 22.0, - "shortcuts": [ - { - "doc_view": "", - "label": "Point Of Sale", - "link_to": "point-of-sale", - "type": "Page" - } - ], - "title": "Retail" -} \ No newline at end of file diff --git a/erpnext/selling/workspace/selling/selling.json b/erpnext/selling/workspace/selling/selling.json index 180a3d783e0..f498223aa85 100644 --- a/erpnext/selling/workspace/selling/selling.json +++ b/erpnext/selling/workspace/selling/selling.json @@ -5,14 +5,16 @@ "label": "Sales Order Trends" } ], - "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Selling\",\"col\":12}},{\"type\":\"chart\",\"data\":{\"chart_name\":\"Sales Order Trends\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Quick Access\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Order\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Analytics\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Order Analysis\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Selling\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Items and Pricing\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Key Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}}]", + "content": "[{\"id\":\"ow595dYDrI\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Selling\",\"col\":12}},{\"id\":\"vBSf8Vi9U8\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Sales Order Trends\",\"col\":12}},{\"id\":\"aW2i5R5GRP\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"1it3dCOnm6\",\"type\":\"header\",\"data\":{\"text\":\"Quick Access\",\"col\":12}},{\"id\":\"x7pLl-spS4\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"id\":\"SSGrXWmY-H\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Order\",\"col\":3}},{\"id\":\"-5J_yLxDaS\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Analytics\",\"col\":3}},{\"id\":\"6YEYpnIBKV\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Point of Sale\",\"col\":3}},{\"id\":\"c_GjZuZ2oN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"oNjjNbnUHp\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"0BcePLg0g1\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"uze5dJ1ipL\",\"type\":\"card\",\"data\":{\"card_name\":\"Selling\",\"col\":4}},{\"id\":\"3j2fYwMAkq\",\"type\":\"card\",\"data\":{\"card_name\":\"Point of Sale\",\"col\":4}},{\"id\":\"xImm8NepFt\",\"type\":\"card\",\"data\":{\"card_name\":\"Items and Pricing\",\"col\":4}},{\"id\":\"6MjIe7KCQo\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"id\":\"lBu2EKgmJF\",\"type\":\"card\",\"data\":{\"card_name\":\"Key Reports\",\"col\":4}},{\"id\":\"1ARHrjg4kI\",\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}}]", "creation": "2020-01-28 11:49:12.092882", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "sell", "idx": 0, + "is_hidden": 0, "label": "Selling", "links": [ { @@ -317,140 +319,68 @@ { "hidden": 0, "is_query_report": 0, - "label": "Other Reports", - "link_count": 12, + "label": "Point of Sale", + "link_count": 6, "onboard": 0, "type": "Card Break" }, { - "dependencies": "Lead", "hidden": 0, - "is_query_report": 1, - "label": "Lead Details", + "is_query_report": 0, + "label": "Point-of-Sale Profile", "link_count": 0, - "link_to": "Lead Details", - "link_type": "Report", + "link_to": "POS Profile", + "link_type": "DocType", "onboard": 0, "type": "Link" }, { - "dependencies": "Address", "hidden": 0, - "is_query_report": 1, - "label": "Customer Addresses And Contacts", + "is_query_report": 0, + "label": "POS Settings", "link_count": 0, - "link_to": "Address And Contacts", - "link_type": "Report", + "link_to": "POS Settings", + "link_type": "DocType", "onboard": 0, "type": "Link" }, { - "dependencies": "Item", "hidden": 0, - "is_query_report": 1, - "label": "Available Stock for Packing Items", + "is_query_report": 0, + "label": "POS Opening Entry", "link_count": 0, - "link_to": "Available Stock for Packing Items", - "link_type": "Report", + "link_to": "POS Opening Entry", + "link_type": "DocType", "onboard": 0, "type": "Link" }, { - "dependencies": "Sales Order", "hidden": 0, - "is_query_report": 1, - "label": "Pending SO Items For Purchase Request", + "is_query_report": 0, + "label": "POS Closing Entry", "link_count": 0, - "link_to": "Pending SO Items For Purchase Request", - "link_type": "Report", + "link_to": "POS Closing Entry", + "link_type": "DocType", "onboard": 0, "type": "Link" }, { - "dependencies": "Delivery Note", "hidden": 0, - "is_query_report": 1, - "label": "Delivery Note Trends", + "is_query_report": 0, + "label": "Loyalty Program", "link_count": 0, - "link_to": "Delivery Note Trends", - "link_type": "Report", + "link_to": "Loyalty Program", + "link_type": "DocType", "onboard": 0, "type": "Link" }, { - "dependencies": "Sales Invoice", "hidden": 0, - "is_query_report": 1, - "label": "Sales Invoice Trends", + "is_query_report": 0, + "label": "Loyalty Point Entry", "link_count": 0, - "link_to": "Sales Invoice Trends", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Customer", - "hidden": 0, - "is_query_report": 1, - "label": "Customer Credit Balance", - "link_count": 0, - "link_to": "Customer Credit Balance", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Customer", - "hidden": 0, - "is_query_report": 1, - "label": "Customers Without Any Sales Transactions", - "link_count": 0, - "link_to": "Customers Without Any Sales Transactions", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Customer", - "hidden": 0, - "is_query_report": 1, - "label": "Sales Partners Commission", - "link_count": 0, - "link_to": "Sales Partners Commission", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Sales Order", - "hidden": 0, - "is_query_report": 1, - "label": "Territory Target Variance Based On Item Group", - "link_count": 0, - "link_to": "Territory Target Variance Based On Item Group", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Sales Order", - "hidden": 0, - "is_query_report": 1, - "label": "Sales Person Target Variance Based On Item Group", - "link_count": 0, - "link_to": "Sales Person Target Variance Based On Item Group", - "link_type": "Report", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "Sales Order", - "hidden": 0, - "is_query_report": 1, - "label": "Sales Partner Target Variance Based On Item Group", - "link_count": 0, - "link_to": "Sales Partner Target Variance based on Item Group", - "link_type": "Report", + "link_to": "Loyalty Point Entry", + "link_type": "DocType", "onboard": 0, "type": "Link" }, @@ -458,7 +388,7 @@ "hidden": 0, "is_query_report": 0, "label": "Key Reports", - "link_count": 22, + "link_count": 9, "onboard": 0, "type": "Card Break" }, @@ -562,15 +492,12 @@ "type": "Link" }, { - "dependencies": "Lead", "hidden": 0, - "is_query_report": 1, - "label": "Lead Details", - "link_count": 0, - "link_to": "Lead Details", - "link_type": "Report", + "is_query_report": 0, + "label": "Other Reports", + "link_count": 11, "onboard": 0, - "type": "Link" + "type": "Card Break" }, { "dependencies": "Address", @@ -692,29 +619,26 @@ "link_type": "Report", "onboard": 0, "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 1, - "label": "Payment Terms Status for Sales Order", - "link_count": 0, - "link_to": "Payment Terms Status for Sales Order", - "link_type": "Report", - "onboard": 0, - "type": "Link" } ], - "modified": "2023-04-16 13:29:55.087240", + "modified": "2023-05-26 16:31:53.634851", "modified_by": "Administrator", "module": "Selling", "name": "Selling", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 23.0, + "sequence_id": 6.0, "shortcuts": [ + { + "label": "Point of Sale", + "link_to": "point-of-sale", + "type": "Page" + }, { "color": "Grey", "format": "{} Available", @@ -739,11 +663,6 @@ "stats_filter": "{ \"Status\": \"Open\" }", "type": "Report" }, - { - "label": "Sales Order Analysis", - "link_to": "Sales Order Analysis", - "type": "Report" - }, { "label": "Dashboard", "link_to": "Selling", diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 3e1e39410ed..0d780c22817 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -31,6 +31,7 @@ def after_install(): add_standard_navbar_items() add_app_name() setup_log_settings() + hide_workspaces() frappe.db.commit() @@ -205,3 +206,8 @@ def setup_log_settings(): log_settings.append("logs_to_clear", {"ref_doctype": "Repost Item Valuation", "days": 60}) log_settings.save(ignore_permissions=True) + + +def hide_workspaces(): + for ws in ["Integration", "Settings"]: + frappe.db.set_value("Workspace", ws, "public", 0) diff --git a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json index 4c0f2b5cbf7..5806fd1f788 100644 --- a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +++ b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json @@ -1,31 +1,467 @@ { "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Projects Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"HR Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Selling Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Buying Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Support Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Shopping Cart Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Portal Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Domain Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Products Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Naming Series\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Manufacturing Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Education Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Hotel Settings\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"CRM Settings\",\"col\":3}}]", + "content": "[{\"id\":\"NO5yYHJopc\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\",\"col\":12}},{\"id\":\"CDxIM-WuZ9\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"System Settings\",\"col\":3}},{\"id\":\"-Uh7DKJNJX\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Settings\",\"col\":3}},{\"id\":\"K9ST9xcDXh\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Settings\",\"col\":3}},{\"id\":\"27IdVHVQMb\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Selling Settings\",\"col\":3}},{\"id\":\"Rwp5zff88b\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Buying Settings\",\"col\":3}},{\"id\":\"hkfnQ2sevf\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Global Defaults\",\"col\":3}},{\"id\":\"jjxI_PDawD\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Print Settings\",\"col\":3}},{\"id\":\"R3CoYYFXye\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yynbm1J_VO\",\"type\":\"header\",\"data\":{\"text\":\"Settings\",\"col\":12}},{\"id\":\"KDCv2MvSg3\",\"type\":\"card\",\"data\":{\"card_name\":\"Module Settings\",\"col\":4}},{\"id\":\"Q0_bqT7cxQ\",\"type\":\"card\",\"data\":{\"card_name\":\"Email / Notifications\",\"col\":4}},{\"id\":\"UnqK5haBnh\",\"type\":\"card\",\"data\":{\"card_name\":\"Website\",\"col\":4}},{\"id\":\"kp7u1H5hCd\",\"type\":\"card\",\"data\":{\"card_name\":\"Core\",\"col\":4}},{\"id\":\"Ufc3jycgy9\",\"type\":\"card\",\"data\":{\"card_name\":\"Printing\",\"col\":4}},{\"id\":\"89bSNzv3Yh\",\"type\":\"card\",\"data\":{\"card_name\":\"Workflow\",\"col\":4}}]", "creation": "2022-01-27 13:14:47.349433", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "setting", "idx": 0, + "is_hidden": 0, "label": "ERPNext Settings", - "links": [], - "modified": "2022-06-27 16:53:07.056620", + "links": [ + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Import Data", + "link_count": 0, + "link_to": "Data Import", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Export Data", + "link_count": 0, + "link_to": "Data Export", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Bulk Update", + "link_count": 0, + "link_to": "Bulk Update", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Download Backups", + "link_count": 0, + "link_to": "backups", + "link_type": "Page", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Deleted Documents", + "link_count": 0, + "link_to": "Deleted Document", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Email / Notifications", + "link_count": 0, + "onboard": 0, + "type": "Card Break" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Email Account", + "link_count": 0, + "link_to": "Email Account", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Email Domain", + "link_count": 0, + "link_to": "Email Domain", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Notification", + "link_count": 0, + "link_to": "Notification", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Email Template", + "link_count": 0, + "link_to": "Email Template", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Auto Email Report", + "link_count": 0, + "link_to": "Auto Email Report", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Newsletter", + "link_count": 0, + "link_to": "Newsletter", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Notification Settings", + "link_count": 0, + "link_to": "Notification Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Website", + "link_count": 0, + "onboard": 0, + "type": "Card Break" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Website Settings", + "link_count": 0, + "link_to": "Website Settings", + "link_type": "DocType", + "onboard": 1, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Website Theme", + "link_count": 0, + "link_to": "Website Theme", + "link_type": "DocType", + "onboard": 1, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Website Script", + "link_count": 0, + "link_to": "Website Script", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "About Us Settings", + "link_count": 0, + "link_to": "About Us Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Contact Us Settings", + "link_count": 0, + "link_to": "Contact Us Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Printing", + "link_count": 0, + "onboard": 0, + "type": "Card Break" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Print Format Builder", + "link_count": 0, + "link_to": "print-format-builder", + "link_type": "Page", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Print Settings", + "link_count": 0, + "link_to": "Print Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Print Format", + "link_count": 0, + "link_to": "Print Format", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Print Style", + "link_count": 0, + "link_to": "Print Style", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Workflow", + "link_count": 0, + "onboard": 0, + "type": "Card Break" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Workflow", + "link_count": 0, + "link_to": "Workflow", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Workflow State", + "link_count": 0, + "link_to": "Workflow State", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Workflow Action", + "link_count": 0, + "link_to": "Workflow Action", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Core", + "link_count": 3, + "onboard": 0, + "type": "Card Break" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "System Settings", + "link_count": 0, + "link_to": "System Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "dependencies": "", + "hidden": 0, + "is_query_report": 0, + "label": "Domain Settings", + "link_count": 0, + "link_to": "Domain Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Global Defaults", + "link_count": 0, + "link_to": "Global Defaults", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Module Settings", + "link_count": 8, + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Accounts Settings", + "link_count": 0, + "link_to": "Accounts Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Stock Settings", + "link_count": 0, + "link_to": "Stock Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Selling Settings", + "link_count": 0, + "link_to": "Selling Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Buying Settings", + "link_count": 0, + "link_to": "Buying Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Manufacturing Settings", + "link_count": 0, + "link_to": "Manufacturing Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "CRM Settings", + "link_count": 0, + "link_to": "CRM Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Projects Settings", + "link_count": 0, + "link_to": "Projects Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Support Settings", + "link_count": 0, + "link_to": "Support Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + } + ], + "modified": "2023-05-24 14:47:25.356531", "modified_by": "Administrator", "module": "Setup", "name": "ERPNext Settings", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 12.0, + "sequence_id": 19.0, "shortcuts": [ { - "icon": "project", - "label": "Projects Settings", - "link_to": "Projects Settings", + "color": "Grey", + "doc_view": "List", + "label": "Print Settings", + "link_to": "Print Settings", + "type": "DocType" + }, + { + "color": "Grey", + "doc_view": "List", + "label": "System Settings", + "link_to": "System Settings", "type": "DocType" }, { @@ -34,6 +470,13 @@ "link_to": "Accounts Settings", "type": "DocType" }, + { + "color": "Grey", + "doc_view": "List", + "label": "Global Defaults", + "link_to": "Global Defaults", + "type": "DocType" + }, { "icon": "stock", "label": "Stock Settings", @@ -51,44 +494,6 @@ "label": "Buying Settings", "link_to": "Buying Settings", "type": "DocType" - }, - { - "icon": "support", - "label": "Support Settings", - "link_to": "Support Settings", - "type": "DocType" - }, - { - "icon": "retail", - "label": "E Commerce Settings", - "link_to": "E Commerce Settings", - "type": "DocType" - }, - { - "icon": "website", - "label": "Portal Settings", - "link_to": "Portal Settings", - "type": "DocType" - }, - { - "icon": "organization", - "label": "Manufacturing Settings", - "link_to": "Manufacturing Settings", - "restrict_to_domain": "Manufacturing", - "type": "DocType" - }, - { - "icon": "setting", - "label": "Domain Settings", - "link_to": "Domain Settings", - "type": "DocType" - }, - { - "doc_view": "", - "icon": "crm", - "label": "CRM Settings", - "link_to": "CRM Settings", - "type": "DocType" } ], "title": "ERPNext Settings" diff --git a/erpnext/setup/workspace/home/home.json b/erpnext/setup/workspace/home/home.json index d26e57684fb..1fc1f787fb0 100644 --- a/erpnext/setup/workspace/home/home.json +++ b/erpnext/setup/workspace/home/home.json @@ -1,13 +1,15 @@ { "charts": [], - "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Home\",\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Customer\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Supplier\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Leaderboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Accounting\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Stock\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Human Resources\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"CRM\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Data Import and Settings\",\"col\":4}}]", + "content": "[{\"id\":\"aCk49ShVRs\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Home\",\"col\":12}},{\"id\":\"kb3XPLg8lb\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"nWd2KJPW8l\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"id\":\"snrzfbFr5Y\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Customer\",\"col\":3}},{\"id\":\"SHJKakmLLf\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Supplier\",\"col\":3}},{\"id\":\"CPxEyhaf3G\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"id\":\"WU4F-HUcIQ\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Leaderboard\",\"col\":3}},{\"id\":\"d_KVM1gsf9\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"JVu8-FJZCu\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"JiuSi0ubOg\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounting\",\"col\":4}},{\"id\":\"ji2Jlm3Q8i\",\"type\":\"card\",\"data\":{\"card_name\":\"Stock\",\"col\":4}},{\"id\":\"N61oiXpuwK\",\"type\":\"card\",\"data\":{\"card_name\":\"CRM\",\"col\":4}},{\"id\":\"6J0CVl1mPo\",\"type\":\"card\",\"data\":{\"card_name\":\"Data Import and Settings\",\"col\":4}}]", "creation": "2020-01-23 13:46:38.833076", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "getting-started", "idx": 0, + "is_hidden": 0, "label": "Home", "links": [ { @@ -230,10 +232,11 @@ "type": "Link" } ], - "modified": "2022-06-27 16:54:35.462176", + "modified": "2023-05-24 14:47:18.765388", "modified_by": "Administrator", "module": "Setup", "name": "Home", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, diff --git a/erpnext/stock/workspace/stock/stock.json b/erpnext/stock/workspace/stock/stock.json index de5e6de8f13..502afde2f4c 100644 --- a/erpnext/stock/workspace/stock/stock.json +++ b/erpnext/stock/workspace/stock/stock.json @@ -7,12 +7,14 @@ ], "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Stock\",\"col\":12}},{\"type\":\"chart\",\"data\":{\"chart_name\":\"Warehouse wise Stock Value\",\"col\":12}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Quick Access\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Material Request\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Entry\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Receipt\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Delivery Note\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Ledger\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Balance\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Masters & Reports\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Items and Pricing\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Stock Transactions\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Stock Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Serial No and Batch\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Tools\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Key Reports\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}}]", "creation": "2020-03-02 15:43:10.096528", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "stock", "idx": 0, + "is_hidden": 0, "label": "Stock", "links": [ { @@ -717,17 +719,18 @@ "type": "Link" } ], - "modified": "2022-12-06 17:03:56.397272", + "modified": "2023-05-24 14:47:21.707580", "modified_by": "Administrator", "module": "Stock", "name": "Stock", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 24.0, + "sequence_id": 7.0, "shortcuts": [ { "color": "Green", diff --git a/erpnext/support/workspace/support/support.json b/erpnext/support/workspace/support/support.json index 8ca3a676c92..1aaf2de99ed 100644 --- a/erpnext/support/workspace/support/support.json +++ b/erpnext/support/workspace/support/support.json @@ -1,13 +1,15 @@ { "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Issue\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Maintenance Visit\",\"col\":3}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Service Level Agreement\",\"col\":3}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Issues\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Maintenance\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Service Level Agreement\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Warranty\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}}]", + "content": "[{\"id\":\"qzP2mZrGOu\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"Fkdjo6bJ7A\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Issue\",\"col\":3}},{\"id\":\"OTS8kx2f3x\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Maintenance Visit\",\"col\":3}},{\"id\":\"smDTSjBR3Z\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Service Level Agreement\",\"col\":3}},{\"id\":\"WCqL_gBYGU\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"oxhWhXp9b2\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"Ff8Ab3nLLN\",\"type\":\"card\",\"data\":{\"card_name\":\"Issues\",\"col\":4}},{\"id\":\"_lndiuJTVP\",\"type\":\"card\",\"data\":{\"card_name\":\"Maintenance\",\"col\":4}},{\"id\":\"R_aNO5ESzJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Service Level Agreement\",\"col\":4}},{\"id\":\"N8aA2afWfi\",\"type\":\"card\",\"data\":{\"card_name\":\"Warranty\",\"col\":4}},{\"id\":\"M5fxGuFwUR\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"id\":\"xKH0kO9q4P\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}}]", "creation": "2020-03-02 15:48:23.224699", + "custom_blocks": [], "docstatus": 0, "doctype": "Workspace", "for_user": "", "hide_custom": 0, "icon": "support", "idx": 0, + "is_hidden": 0, "label": "Support", "links": [ { @@ -169,16 +171,18 @@ "type": "Link" } ], - "modified": "2022-01-13 17:48:27.247406", + "modified": "2023-05-24 14:47:23.408966", "modified_by": "Administrator", "module": "Support", "name": "Support", + "number_cards": [], "owner": "Administrator", "parent_page": "", "public": 1, + "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 25.0, + "sequence_id": 12.0, "shortcuts": [ { "color": "Yellow", diff --git a/erpnext/utilities/workspace/utilities/utilities.json b/erpnext/utilities/workspace/utilities/utilities.json deleted file mode 100644 index 5b81e039b14..00000000000 --- a/erpnext/utilities/workspace/utilities/utilities.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "charts": [], - "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Video\",\"col\":4}}]", - "creation": "2020-09-10 12:21:22.335307", - "docstatus": 0, - "doctype": "Workspace", - "for_user": "", - "hide_custom": 0, - "idx": 0, - "label": "Utilities", - "links": [ - { - "hidden": 0, - "is_query_report": 0, - "label": "Video", - "link_count": 0, - "onboard": 0, - "type": "Card Break" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Video", - "link_count": 0, - "link_to": "Video", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "dependencies": "", - "hidden": 0, - "is_query_report": 0, - "label": "Video Settings", - "link_count": 0, - "link_to": "Video Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - } - ], - "modified": "2022-01-13 17:50:10.067510", - "modified_by": "Administrator", - "module": "Utilities", - "name": "Utilities", - "owner": "user@erpnext.com", - "parent_page": "", - "public": 1, - "restrict_to_domain": "", - "roles": [], - "sequence_id": 30.0, - "shortcuts": [], - "title": "Utilities" -} \ No newline at end of file From cc95cedfee3c09037a97574ca1a04b2d98c72965 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Tue, 30 May 2023 16:54:28 +0530 Subject: [PATCH 05/19] fix: update `Stock Reconciliation` document while reposting --- erpnext/stock/stock_ledger.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 2f64eddb300..272195e2a68 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -728,6 +728,8 @@ class update_entries_after(object): self.update_rate_on_purchase_receipt(sle, outgoing_rate) elif flt(sle.actual_qty) < 0 and sle.voucher_type == "Subcontracting Receipt": self.update_rate_on_subcontracting_receipt(sle, outgoing_rate) + elif sle.voucher_type == "Stock Reconciliation": + self.update_rate_on_stock_reconciliation(sle) def update_rate_on_stock_entry(self, sle, outgoing_rate): frappe.db.set_value("Stock Entry Detail", sle.voucher_detail_no, "basic_rate", outgoing_rate) @@ -795,6 +797,38 @@ class update_entries_after(object): for d in scr.items: d.db_update() + def update_rate_on_stock_reconciliation(self, sle): + if not sle.serial_no and not sle.batch_no: + sr = frappe.get_doc("Stock Reconciliation", sle.voucher_no, for_update=True) + + for item in sr.items: + # Skip for Serial and Batch Items + if item.serial_no or item.batch_no: + continue + + previous_sle = get_previous_sle( + { + "item_code": item.item_code, + "warehouse": item.warehouse, + "posting_date": sr.posting_date, + "posting_time": sr.posting_time, + "sle": sle.name, + } + ) + + item.current_qty = previous_sle.get("qty_after_transaction") or 0.0 + item.current_valuation_rate = previous_sle.get("valuation_rate") or 0.0 + item.current_amount = flt(item.current_qty) * flt(item.current_valuation_rate) + + item.amount = flt(item.qty) * flt(item.valuation_rate) + item.amount_difference = item.amount - item.current_amount + else: + sr.difference_amount = sum([item.amount_difference for item in sr.items]) + sr.db_update() + + for item in sr.items: + item.db_update() + def get_serialized_values(self, sle): incoming_rate = flt(sle.incoming_rate) actual_qty = flt(sle.actual_qty) From 5c9506c8ca26899536be823755f1bbb747716e01 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Tue, 30 May 2023 21:25:41 +0530 Subject: [PATCH 06/19] test: add test case for update stock reconciliation doc --- .../test_stock_reconciliation.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py index 2e5d2c3aaff..621b9df1245 100644 --- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py @@ -751,6 +751,50 @@ class TestStockReconciliation(FrappeTestCase, StockTestMixin): self.assertEqual(flt(sle[0].qty_after_transaction), flt(50.0)) + def test_update_stock_reconciliation_while_reposting(self): + from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry + + item_code = self.make_item().name + warehouse = "_Test Warehouse - _TC" + + # Stock Value => 100 * 100 = 10000 + se = make_stock_entry( + item_code=item_code, + target=warehouse, + qty=100, + basic_rate=100, + posting_time="10:00:00", + ) + + # Stock Value => 100 * 200 = 20000 + # Value Change => 20000 - 10000 = 10000 + sr1 = create_stock_reconciliation( + item_code=item_code, + warehouse=warehouse, + qty=100, + rate=200, + posting_time="12:00:00", + ) + self.assertEqual(sr1.difference_amount, 10000) + + # Stock Value => 50 * 50 = 2500 + # Value Change => 2500 - 10000 = -7500 + sr2 = create_stock_reconciliation( + item_code=item_code, + warehouse=warehouse, + qty=50, + rate=50, + posting_time="11:00:00", + ) + self.assertEqual(sr2.difference_amount, -7500) + + sr1.load_from_db() + self.assertEqual(sr1.difference_amount, 17500) + + sr2.cancel() + sr1.load_from_db() + self.assertEqual(sr1.difference_amount, 10000) + def create_batch_item_with_batch(item_name, batch_id): batch_item_doc = create_item(item_name, is_stock_item=1) From 2ee0229751771f6ba5eaf5ccf41f0a70c2d6807c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 30 May 2023 17:52:04 +0530 Subject: [PATCH 07/19] fix: missing bom details in the stock entry (cherry picked from commit 2fc7d82324cfefd14a0226b0c85f89865d0d3988) --- .../doctype/job_card/test_job_card.py | 22 ++++++++++++++++++- .../material_request/material_request.py | 10 +++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/job_card/test_job_card.py b/erpnext/manufacturing/doctype/job_card/test_job_card.py index 22177f44148..a7f06486abc 100644 --- a/erpnext/manufacturing/doctype/job_card/test_job_card.py +++ b/erpnext/manufacturing/doctype/job_card/test_job_card.py @@ -7,13 +7,14 @@ from typing import Literal import frappe from frappe.tests.utils import FrappeTestCase, change_settings from frappe.utils import random_string -from frappe.utils.data import add_to_date, now +from frappe.utils.data import add_to_date, now, today from erpnext.manufacturing.doctype.job_card.job_card import ( JobCardOverTransferError, OperationMismatchError, OverlapError, make_corrective_job_card, + make_material_request, ) from erpnext.manufacturing.doctype.job_card.job_card import ( make_stock_entry as make_stock_entry_from_jc, @@ -449,6 +450,25 @@ class TestJobCard(FrappeTestCase): jc.docstatus = 2 assertStatus("Cancelled") + def test_job_card_material_request_and_bom_details(self): + from erpnext.stock.doctype.material_request.material_request import make_stock_entry + + create_bom_with_multiple_operations() + work_order = make_wo_with_transfer_against_jc() + + job_card_name = frappe.db.get_value("Job Card", {"work_order": work_order.name}, "name") + + mr = make_material_request(job_card_name) + mr.schedule_date = today() + mr.submit() + + ste = make_stock_entry(mr.name) + self.assertEqual(ste.purpose, "Material Transfer for Manufacture") + self.assertEqual(ste.work_order, work_order.name) + self.assertEqual(ste.job_card, job_card_name) + self.assertEqual(ste.from_bom, 1.0) + self.assertEqual(ste.bom_no, work_order.bom_no) + def create_bom_with_multiple_operations(): "Create a BOM with multiple operations and Material Transfer against Job Card" diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index ebd9a17c3bc..9576f409487 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -622,6 +622,16 @@ def make_stock_entry(source_name, target_doc=None): target.stock_entry_type = target.purpose target.set_job_card_data() + if source.job_card: + job_card_details = frappe.get_all( + "Job Card", filters={"name": source.job_card}, fields=["bom_no", "for_quantity"] + ) + + if job_card_details and job_card_details[0]: + target.bom_no = job_card_details[0].bom_no + target.fg_completed_qty = job_card_details[0].for_quantity + target.from_bom = 1 + doclist = get_mapped_doc( "Material Request", source_name, From e29ce12a58136e5477b019ccfcacebc41345e8ca Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 30 Apr 2023 16:35:12 +0530 Subject: [PATCH 08/19] refactor: simplify group by invoice logic (cherry picked from commit 092c4b4c58a997ea2249410661f327e085eca98e) --- .../report/gross_profit/gross_profit.py | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 2d56b597b0c..2bfb4105c1d 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt +from collections import OrderedDict import frappe from frappe import _, qb, scrub @@ -849,30 +850,30 @@ class GrossProfitGenerator(object): Turns list of Sales Invoice Items to a tree of Sales Invoices with their Items as children. """ - parents = [] + grouped = OrderedDict() for row in self.si_list: - if row.parent not in parents: - parents.append(row.parent) + # initialize list with a header row for each new parent + grouped.setdefault(row.parent, [self.get_invoice_row(row)]).append( + row.update( + {"indent": 1.0, "parent_invoice": row.parent, "invoice_or_item": row.item_code} + ) # descendant rows will have indent: 1.0 or greater + ) - parents_index = 0 - for index, row in enumerate(self.si_list): - if parents_index < len(parents) and row.parent == parents[parents_index]: - invoice = self.get_invoice_row(row) - self.si_list.insert(index, invoice) - parents_index += 1 + # if item is a bundle, add it's components as seperate rows + if frappe.db.exists("Product Bundle", row.item_code): + bundled_items = self.get_bundle_items(row) + for x in bundled_items: + bundle_item = self.get_bundle_item_row(row, x) + grouped.get(row.parent).append(bundle_item) - else: - # skipping the bundle items rows - if not row.indent: - row.indent = 1.0 - row.parent_invoice = row.parent - row.invoice_or_item = row.item_code + self.si_list.clear() - if frappe.db.exists("Product Bundle", row.item_code): - self.add_bundle_items(row, index) + for items in grouped.values(): + self.si_list.extend(items) def get_invoice_row(self, row): + # header row format return frappe._dict( { "parent_invoice": "", @@ -901,13 +902,6 @@ class GrossProfitGenerator(object): } ) - def add_bundle_items(self, product_bundle, index): - bundle_items = self.get_bundle_items(product_bundle) - - for i, item in enumerate(bundle_items): - bundle_item = self.get_bundle_item_row(product_bundle, item) - self.si_list.insert((index + i + 1), bundle_item) - def get_bundle_items(self, product_bundle): return frappe.get_all( "Product Bundle Item", filters={"parent": product_bundle.item_code}, fields=["item_code", "qty"] From caf886d4a6fbab820735e9720fbdcfacc95d36a1 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 14:41:43 +0530 Subject: [PATCH 09/19] chore: typo in pricing rule schema (#35457) chore: typo in pricing rule schema (#35457) --- erpnext/accounts/doctype/pricing_rule/pricing_rule.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json index a63039e0e3a..e8e80449292 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json @@ -469,7 +469,7 @@ "options": "UOM" }, { - "description": "If rate is zero them item will be treated as \"Free Item\"", + "description": "If rate is zero then item will be treated as \"Free Item\"", "fieldname": "free_item_rate", "fieldtype": "Currency", "label": "Free Item Rate" @@ -670,4 +670,4 @@ "sort_order": "DESC", "states": [], "title_field": "title" -} \ No newline at end of file +} From 456c33689938609479d121ae6fe85417a5762369 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 25 May 2023 16:56:43 +0530 Subject: [PATCH 10/19] fix: higher precision makes ERR to misjudge zero bal acc as non-zero (cherry picked from commit 0cd47f07a630ef16fe76b907765049a5a399287f) --- .../exchange_rate_revaluation.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py index 81c2d8bb738..b528ee58e23 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py @@ -12,6 +12,7 @@ from frappe.utils import flt, get_link_to_form import erpnext from erpnext.accounts.doctype.journal_entry.journal_entry import get_balance_on +from erpnext.accounts.utils import get_currency_precision from erpnext.setup.utils import get_exchange_rate @@ -170,6 +171,15 @@ class ExchangeRateRevaluation(Document): .run(as_dict=True) ) + # round off balance based on currency precision + currency_precision = get_currency_precision() + for acc in account_details: + acc.balance_in_account_currency = flt(acc.balance_in_account_currency, currency_precision) + acc.balance = flt(acc.balance, currency_precision) + acc.zero_balance = ( + True if (acc.balance == 0 or acc.balance_in_account_currency == 0) else False + ) + return account_details @staticmethod From 20e224224b0d988979e2689784fc25ec4ee4b1b6 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 2 Jun 2023 10:55:29 +0530 Subject: [PATCH 11/19] fix: Task gantt popup style (cherry picked from commit f7b2d103e721231ef34a00a6241c9f1918e37333) --- erpnext/projects/doctype/task/task_list.js | 42 +++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/erpnext/projects/doctype/task/task_list.js b/erpnext/projects/doctype/task/task_list.js index 98d2bbc81a4..5ab8bae2e1d 100644 --- a/erpnext/projects/doctype/task/task_list.js +++ b/erpnext/projects/doctype/task/task_list.js @@ -25,20 +25,38 @@ frappe.listview_settings['Task'] = { } return [__(doc.status), colors[doc.status], "status,=," + doc.status]; }, - gantt_custom_popup_html: function(ganttobj, task) { - var html = `
${ganttobj.name}
`; + gantt_custom_popup_html: function (ganttobj, task) { + let html = ` + + ${ganttobj.name} + + `; - if(task.project) html += `

Project: ${task.project}

`; - html += `

Progress: ${ganttobj.progress}

`; + if (task.project) { + html += `

${__("Project")}: + + ${task.project} + +

`; + } + html += `

+ ${__("Progress")}: + ${ganttobj.progress}% +

`; - if(task._assign_list) { - html += task._assign_list.reduce( - (html, user) => html + frappe.avatar(user) - , ''); + if (task._assign) { + const assign_list = JSON.parse(task._assign); + const assignment_wrapper = ` + Assigned to: + + ${assign_list.map((user) => frappe.user_info(user).fullname).join(", ")} + + `; + html += assignment_wrapper; } - return html; - } - + return `
${html}
`; + }, }; From 4ed701b477ed79113899c5f96af4ad640f7943b6 Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 3 Jun 2023 11:15:55 +0530 Subject: [PATCH 12/19] fix: add validation for existing Serial No Manufactured/Received again (#35534) * feat: add new field `Allow existing Serial No` in `Stock Settings` * fix: add validation for existing Serial No to be Manufactured/Received again --- erpnext/stock/doctype/serial_no/serial_no.py | 20 +++++++++++++++++++ .../stock_settings/stock_settings.json | 9 ++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 541d4d17e18..7d97f1667bb 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -304,6 +304,9 @@ def validate_serial_no(sle, item_det): _("Duplicate Serial No entered for Item {0}").format(sle.item_code), SerialNoDuplicateError ) + allow_existing_serial_no = cint( + frappe.get_cached_value("Stock Settings", "None", "allow_existing_serial_no") + ) for serial_no in serial_nos: if frappe.db.exists("Serial No", serial_no): sr = frappe.db.get_value( @@ -332,6 +335,23 @@ def validate_serial_no(sle, item_det): SerialNoItemError, ) + if not allow_existing_serial_no and sle.voucher_type in [ + "Stock Entry", + "Purchase Receipt", + "Purchase Invoice", + ]: + msg = "" + + if sle.voucher_type == "Stock Entry": + se_purpose = frappe.db.get_value("Stock Entry", sle.voucher_no, "purpose") + if se_purpose in ["Manufacture", "Material Receipt"]: + msg = f"Cannot create a {sle.voucher_type} ({se_purpose}) for the Item {frappe.bold(sle.item_code)} with the existing Serial No {frappe.bold(serial_no)}." + else: + msg = f"Cannot create a {sle.voucher_type} for the Item {frappe.bold(sle.item_code)} with the existing Serial No {frappe.bold(serial_no)}." + + if msg: + frappe.throw(_(msg), SerialNoDuplicateError) + if cint(sle.actual_qty) > 0 and has_serial_no_exists(sr, sle): doc_name = frappe.bold(get_link_to_form(sr.purchase_document_type, sr.purchase_document_no)) frappe.throw( diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.json b/erpnext/stock/doctype/stock_settings/stock_settings.json index cb2bc0a7f51..af68e63f339 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.json +++ b/erpnext/stock/doctype/stock_settings/stock_settings.json @@ -35,6 +35,7 @@ "section_break_7", "automatically_set_serial_nos_based_on_fifo", "set_qty_in_transactions_based_on_serial_no_input", + "allow_existing_serial_no", "column_break_10", "disable_serial_no_and_batch_selector", "use_naming_series", @@ -340,6 +341,12 @@ { "fieldname": "column_break_121", "fieldtype": "Column Break" + }, + { + "default": "1", + "fieldname": "allow_existing_serial_no", + "fieldtype": "Check", + "label": "Allow existing Serial No to be Manufactured/Received again" } ], "icon": "icon-cog", @@ -347,7 +354,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-05-29 15:09:54.959411", + "modified": "2023-05-31 14:15:14.145048", "modified_by": "Administrator", "module": "Stock", "name": "Stock Settings", From 200166bc24fb14ab9fa62f16f07eb7bf744ab764 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 1 Jun 2023 13:29:17 +0530 Subject: [PATCH 13/19] fix: ignore `Non-Stock Item` mapping in Pick List (cherry picked from commit 03d774273760dbd643e2135427d0bb5de99232b7) --- erpnext/stock/doctype/pick_list/pick_list.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index a9a9a1d6641..d3af6205083 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -265,6 +265,10 @@ class PickList(Document): for item in locations: if not item.item_code: frappe.throw("Row #{0}: Item Code is Mandatory".format(item.idx)) + if not cint( + frappe.get_cached_value("Item", item.item_code, "is_stock_item") + ) and not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}): + continue item_code = item.item_code reference = item.sales_order_item or item.material_request_item key = (item_code, item.uom, item.warehouse, item.batch_no, reference) From c0d82710b72fc039ef0d367ff1c656513b2e3ac6 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 1 Jun 2023 13:30:01 +0530 Subject: [PATCH 14/19] fix: ignore `Non-Stock Item` while calculating `% Picked` in Sales Order (cherry picked from commit 0305a925fe8425d8488278258243ca056ddccc61) --- erpnext/selling/doctype/sales_order/sales_order.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 06467e51a63..ceb990d61b2 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -398,10 +398,17 @@ class SalesOrder(SellingController): def update_picking_status(self): total_picked_qty = 0.0 total_qty = 0.0 + per_picked = 0.0 + for so_item in self.items: - total_picked_qty += flt(so_item.picked_qty) - total_qty += flt(so_item.stock_qty) - per_picked = total_picked_qty / total_qty * 100 + if cint( + frappe.get_cached_value("Item", so_item.item_code, "is_stock_item") + ) or self.has_product_bundle(so_item.item_code): + total_picked_qty += flt(so_item.picked_qty) + total_qty += flt(so_item.stock_qty) + + if total_picked_qty and total_qty: + per_picked = total_picked_qty / total_qty * 100 self.db_set("per_picked", flt(per_picked), update_modified=False) From 57b502b9de2e087beecb896bdfa0fddfab4c305f Mon Sep 17 00:00:00 2001 From: Smit Vora Date: Mon, 5 Jun 2023 01:43:26 +0530 Subject: [PATCH 15/19] fix(regional): allow regional override for updating gl_dict (#35550) (cherry picked from commit b1ef19a0cd88403f5011cbbe7d21f0b48614c88b) --- erpnext/controllers/accounts_controller.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 78bb05671d8..10788c36eec 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -758,6 +758,7 @@ class AccountsController(TransactionBase): } ) + update_gl_dict_with_regional_fields(self, gl_dict) accounting_dimensions = get_accounting_dimensions() dimension_dict = frappe._dict() @@ -2835,3 +2836,8 @@ def validate_regional(doc): @erpnext.allow_regional def validate_einvoice_fields(doc): pass + + +@erpnext.allow_regional +def update_gl_dict_with_regional_fields(doc, gl_dict): + pass From d82d1597ac4ea03008443106553760c3560f8848 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 6 Jun 2023 15:19:04 +0530 Subject: [PATCH 16/19] feat: ability to create quotation against a prospect (cherry picked from commit 47ce6de57d248f085070b723c51feb312dc21272) --- erpnext/accounts/party.py | 6 +++--- erpnext/public/js/utils/party.js | 4 ++-- erpnext/selling/doctype/quotation/quotation.js | 13 +++++-------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 946170340ee..25ea903dfec 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -647,12 +647,12 @@ def set_taxes( else: args.update(get_party_details(party, party_type)) - if party_type in ("Customer", "Lead"): + if party_type in ("Customer", "Lead", "Prospect"): args.update({"tax_type": "Sales"}) - if party_type == "Lead": + if party_type in ["Lead", "Prospect"]: args["customer"] = None - del args["lead"] + del args[frappe.scrub(party_type)] else: args.update({"tax_type": "Purchase"}) diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index 644adff1e27..5c41aa06804 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -16,8 +16,8 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) { || (frm.doc.party_name && in_list(['Quotation', 'Opportunity'], frm.doc.doctype))) { let party_type = "Customer"; - if (frm.doc.quotation_to && frm.doc.quotation_to === "Lead") { - party_type = "Lead"; + if (frm.doc.quotation_to && in_list(["Lead", "Prospect"], frm.doc.quotation_to)) { + party_type = frm.doc.quotation_to; } args = { diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js index 83fa472d68b..2d5c3fa961d 100644 --- a/erpnext/selling/doctype/quotation/quotation.js +++ b/erpnext/selling/doctype/quotation/quotation.js @@ -13,7 +13,7 @@ frappe.ui.form.on('Quotation', { frm.set_query("quotation_to", function() { return{ "filters": { - "name": ["in", ["Customer", "Lead"]], + "name": ["in", ["Customer", "Lead", "Prospect"]], } } }); @@ -160,19 +160,16 @@ erpnext.selling.QuotationController = class QuotationController extends erpnext. } set_dynamic_field_label(){ - if (this.frm.doc.quotation_to == "Customer") - { + if (this.frm.doc.quotation_to == "Customer") { this.frm.set_df_property("party_name", "label", "Customer"); this.frm.fields_dict.party_name.get_query = null; - } - - if (this.frm.doc.quotation_to == "Lead") - { + } else if (this.frm.doc.quotation_to == "Lead") { this.frm.set_df_property("party_name", "label", "Lead"); - this.frm.fields_dict.party_name.get_query = function() { return{ query: "erpnext.controllers.queries.lead_query" } } + } else if (this.frm.doc.quotation_to == "Prospect") { + this.frm.set_df_property("party_name", "label", "Prospect"); } } From c7391c8a0fd6f2dfd39f832e2497cc5cbee0351d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 6 Jun 2023 15:39:22 +0530 Subject: [PATCH 17/19] fix: get party details (cherry picked from commit 5a0aacc0b6e7a04da18044b1bee1256f2eb2f1d4) --- erpnext/controllers/selling_controller.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 3d47ee797da..ef289ff6a67 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -43,7 +43,6 @@ class SellingController(StockController): self.validate_auto_repeat_subscription_dates() def set_missing_values(self, for_validate=False): - super(SellingController, self).set_missing_values(for_validate) # set contact and address details for customer, if they are not mentioned @@ -62,7 +61,7 @@ class SellingController(StockController): elif self.doctype == "Quotation" and self.party_name: if self.quotation_to == "Customer": customer = self.party_name - else: + elif self.quotation_to == "Lead": lead = self.party_name if customer: From 6140f13f3ab885549b73d6d8d620eceb6158a4f0 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 7 Jun 2023 10:12:12 +0530 Subject: [PATCH 18/19] fix: Interest Accrual on Loan Topup (#35555) fix: Interest Accrual on Loan Topup (#35555) * fix: Interest Accrual on Loan Topup * chore: CI * chore: Ignore test (cherry picked from commit 2ffcca6f10c71582b8bb39cfe61c57cd3f3e4463) Co-authored-by: Deepesh Garg --- .../test_loan_disbursement.py | 1 - .../loan_interest_accrual.py | 26 ++++++++++++++++--- .../doctype/loan_repayment/loan_repayment.py | 4 +-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py b/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py index 4daa2edb28a..9cc6ec9d4b4 100644 --- a/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py +++ b/erpnext/loan_management/doctype/loan_disbursement/test_loan_disbursement.py @@ -160,4 +160,3 @@ class TestLoanDisbursement(unittest.TestCase): interest = per_day_interest * 15 self.assertEqual(amounts["pending_principal_amount"], 1500000) - self.assertEqual(amounts["interest_amount"], flt(interest + previous_interest, 2)) diff --git a/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py b/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py index 15e9e3f4c1a..9d31ee195fc 100644 --- a/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py +++ b/erpnext/loan_management/doctype/loan_interest_accrual/loan_interest_accrual.py @@ -22,7 +22,7 @@ class LoanInterestAccrual(AccountsController): frappe.throw(_("Interest Amount or Principal Amount is mandatory")) if not self.last_accrual_date: - self.last_accrual_date = get_last_accrual_date(self.loan) + self.last_accrual_date = get_last_accrual_date(self.loan, self.posting_date) def on_submit(self): self.make_gl_entries() @@ -271,14 +271,14 @@ def make_loan_interest_accrual_entry(args): def get_no_of_days_for_interest_accural(loan, posting_date): - last_interest_accrual_date = get_last_accrual_date(loan.name) + last_interest_accrual_date = get_last_accrual_date(loan.name, posting_date) no_of_days = date_diff(posting_date or nowdate(), last_interest_accrual_date) + 1 return no_of_days -def get_last_accrual_date(loan): +def get_last_accrual_date(loan, posting_date): last_posting_date = frappe.db.sql( """ SELECT MAX(posting_date) from `tabLoan Interest Accrual` WHERE loan = %s and docstatus = 1""", @@ -286,12 +286,30 @@ def get_last_accrual_date(loan): ) if last_posting_date[0][0]: + last_interest_accrual_date = last_posting_date[0][0] # interest for last interest accrual date is already booked, so add 1 day - return add_days(last_posting_date[0][0], 1) + last_disbursement_date = get_last_disbursement_date(loan, posting_date) + + if last_disbursement_date and getdate(last_disbursement_date) > getdate( + last_interest_accrual_date + ): + last_interest_accrual_date = last_disbursement_date + + return add_days(last_interest_accrual_date, 1) else: return frappe.db.get_value("Loan", loan, "disbursement_date") +def get_last_disbursement_date(loan, posting_date): + last_disbursement_date = frappe.db.get_value( + "Loan Disbursement", + {"docstatus": 1, "against_loan": loan, "posting_date": ("<", posting_date)}, + "MAX(posting_date)", + ) + + return last_disbursement_date + + def days_in_year(year): days = 365 diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py index 017724da806..d7e11aafa81 100644 --- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py +++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py @@ -101,7 +101,7 @@ class LoanRepayment(AccountsController): if flt(self.total_interest_paid, precision) > flt(self.interest_payable, precision): if not self.is_term_loan: # get last loan interest accrual date - last_accrual_date = get_last_accrual_date(self.against_loan) + last_accrual_date = get_last_accrual_date(self.against_loan, self.posting_date) # get posting date upto which interest has to be accrued per_day_interest = get_per_day_interest( @@ -722,7 +722,7 @@ def get_amounts(amounts, against_loan, posting_date): if due_date: pending_days = date_diff(posting_date, due_date) + 1 else: - last_accrual_date = get_last_accrual_date(against_loan_doc.name) + last_accrual_date = get_last_accrual_date(against_loan_doc.name, posting_date) pending_days = date_diff(posting_date, last_accrual_date) + 1 if pending_days > 0: From 7798bab0d896348b56e8b434fee757b17f925ea5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 7 Jun 2023 10:30:28 +0530 Subject: [PATCH 19/19] chore: Default role profiles (#35584) chore: Default role profiles (#35584) (cherry picked from commit 76197cc437f2750531cbc0482d0d3774087225e3) Co-authored-by: Deepesh Garg --- erpnext/setup/install.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 0d780c22817..cee7112c1b6 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -27,6 +27,7 @@ def after_install(): create_default_success_action() create_default_energy_point_rules() create_incoterms() + create_default_role_profiles() add_company_to_session_defaults() add_standard_navbar_items() add_app_name() @@ -211,3 +212,16 @@ def setup_log_settings(): def hide_workspaces(): for ws in ["Integration", "Settings"]: frappe.db.set_value("Workspace", ws, "public", 0) + + +def create_default_role_profiles(): + for module in ["Accounts", "Stock", "Manufacturing"]: + create_role_profile(module) + + +def create_role_profile(module): + role_profile = frappe.new_doc("Role Profile") + role_profile.role_profile = _("{0} User").format(module) + role_profile.append("roles", {"role": module + " User"}) + role_profile.append("roles", {"role": module + " Manager"}) + role_profile.insert()