Merge branch 'develop' into user_change

This commit is contained in:
Deepesh Garg
2026-07-24 12:14:34 +05:30
committed by GitHub
613 changed files with 158508 additions and 110171 deletions

View File

@@ -323,6 +323,8 @@ erpnext.company.setup_queries = function (frm) {
["default_advance_received_account", { root_type: "Liability", account_type: "Receivable" }],
["default_advance_paid_account", { root_type: "Asset", account_type: "Payable" }],
["service_expense_account", { root_type: "Expense" }],
["expenses_added_to_stock_account", { root_type: "Expense" }],
["expenses_added_to_stock_contra_account", { root_type: "Expense" }],
],
function (i, v) {
erpnext.company.set_custom_query(frm, v);

View File

@@ -137,6 +137,10 @@
"disable_sdbnb_in_sr",
"default_provisional_account",
"default_in_transit_warehouse",
"stock_expense_section",
"expenses_added_to_stock_account",
"column_break_gthb",
"expenses_added_to_stock_contra_account",
"manufacturing_section",
"default_operating_cost_account",
"column_break_9prc",
@@ -962,6 +966,18 @@
"label": "Service Expense Account",
"options": "Account"
},
{
"fieldname": "expenses_added_to_stock_account",
"fieldtype": "Link",
"label": "Expenses Added To Stock Account",
"options": "Account"
},
{
"fieldname": "expenses_added_to_stock_contra_account",
"fieldtype": "Link",
"label": "Expenses Added To Stock Contra Account",
"options": "Account"
},
{
"default": "0",
"description": "If enabled, the system will use the inventory account set in the Item Master or Item Group or Brand. Otherwise, it will use the inventory account set in the Warehouse.",
@@ -1071,6 +1087,15 @@
"fieldname": "enable_stock_delivered_but_not_billed",
"fieldtype": "Check",
"label": "Enable Stock Delivered But Not Billed"
},
{
"fieldname": "stock_expense_section",
"fieldtype": "Section Break",
"label": "Stock Expense"
},
{
"fieldname": "column_break_gthb",
"fieldtype": "Column Break"
}
],
"grid_page_length": 50,
@@ -1079,7 +1104,7 @@
"image_field": "company_logo",
"is_tree": 1,
"links": [],
"modified": "2026-07-02 07:21:21.794533",
"modified": "2026-07-15 15:38:29.214020",
"modified_by": "Administrator",
"module": "Setup",
"name": "Company",

View File

@@ -23,7 +23,7 @@ from frappe.utils import (
nowdate,
today,
)
from frappe.utils.nestedset import NestedSet, rebuild_tree
from frappe.utils.nestedset import NestedSet, get_root_of, rebuild_tree
from erpnext.accounts.doctype.account.account import get_account_currency
from erpnext.accounts.doctype.financial_report_template.financial_report_template import (
@@ -104,6 +104,8 @@ class Company(NestedSet):
exception_budget_approver_role: DF.Link | None
exchange_gain_loss_account: DF.Link | None
existing_company: DF.Link | None
expenses_added_to_stock_account: DF.Link | None
expenses_added_to_stock_contra_account: DF.Link | None
fax: DF.Data | None
is_group: DF.Check
lft: DF.Int
@@ -499,91 +501,92 @@ class Company(NestedSet):
)
def create_default_departments(self):
root = get_root_of("Department") or "All Departments"
records = [
# Department
{
"doctype": "Department",
"department_name": _("All Departments"),
"department_name": root,
"is_group": 1,
"parent_department": "",
"__condition": lambda: not frappe.db.exists("Department", _("All Departments")),
"__condition": lambda: not frappe.db.exists("Department", root),
},
{
"doctype": "Department",
"department_name": _("Accounts"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Marketing"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Sales"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Purchase"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Operations"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Production"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Dispatch"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Customer Service"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Human Resources"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Management"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Quality Management"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Research & Development"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
{
"doctype": "Department",
"department_name": _("Legal"),
"parent_department": _("All Departments"),
"parent_department": root,
"company": self.name,
},
]
@@ -1007,7 +1010,7 @@ def get_children(doctype: str, parent: str | None = None, company: str | None =
)
@frappe.whitelist()
@frappe.whitelist(methods=["POST"])
def add_node():
from frappe.desk.treeview import make_tree_args
@@ -1118,7 +1121,7 @@ def get_billing_shipping_address(
return {"primary_address": primary_address, "shipping_address": shipping_address}
@frappe.whitelist()
@frappe.whitelist(methods=["POST"])
def create_transaction_deletion_request(company: str):
frappe.only_for("System Manager")

View File

@@ -1,11 +1,13 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import json
from unittest.mock import patch
import frappe
from frappe import _
from frappe.query_builder.functions import IfNull
from frappe.utils import random_string
from frappe.utils.nestedset import get_root_of
from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import (
get_charts_for_country,
@@ -68,7 +70,12 @@ class TestCompany(ERPNextTestSuite):
try:
company = frappe.new_doc("Company")
company.company_name = template
company.abbr = random_string(3)
# a short random abbr collides with existing test companies often enough
# to flake, so pick one that is verified unique
abbr = random_string(3)
while frappe.db.exists("Company", {"abbr": abbr}):
abbr = random_string(3)
company.abbr = abbr
company.default_currency = "USD"
company.create_chart_of_accounts_based_on = "Standard Template"
company.chart_of_accounts = template
@@ -182,6 +189,31 @@ class TestCompany(ERPNextTestSuite):
return get_no_of_children([company], 0)
def test_default_departments_ignore_session_translations(self):
self.assertEqual(get_root_of("Department"), "All Departments")
translations = {"All Departments": "Alle Abteilungen", "Accounts": "Buchhaltung"}
with patch("frappe.translate.get_all_translations", return_value=translations):
company = frappe.new_doc("Company")
company.company_name = "Dept Translation Test Co"
company.abbr = "DTTC"
company.default_currency = "INR"
company.country = "India"
company.insert()
self.assertFalse(frappe.db.exists("Department", "Alle Abteilungen"))
self.assertEqual(
frappe.get_all("Department", filters={"parent_department": ("is", "not set")}, pluck="name"),
["All Departments"],
)
departments = frappe.get_all(
"Department", filters={"company": company.name}, fields=["name", "parent_department"]
)
self.assertTrue(departments)
self.assertEqual({d.parent_department for d in departments}, {"All Departments"})
self.assertIn("Buchhaltung - DTTC", [d.name for d in departments])
def test_change_parent_company(self):
child_company = frappe.get_doc("Company", "_Test Company 5")

View File

@@ -132,7 +132,7 @@
{
"fieldname": "credit_limits",
"fieldtype": "Table",
"label": "Credit Limit",
"label": "Credit & Overdue Limits",
"options": "Customer Credit Limit"
}
],

View File

@@ -95,7 +95,7 @@ def get_children(
return frappe.get_all("Department", fields=fields, filters=filters, order_by="name")
@frappe.whitelist()
@frappe.whitelist(methods=["POST"])
def add_node():
from frappe.desk.treeview import make_tree_args

View File

@@ -2,7 +2,7 @@
# See license.txt
import frappe
from frappe.utils import add_days, today
from frappe.utils import add_days, getdate, now_datetime, today
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
from erpnext.tests.utils import ERPNextTestSuite
@@ -116,3 +116,38 @@ def create_email_digest(**args):
doc.insert()
return doc
class TestEmailDigestDates(ERPNextTestSuite):
"""The digest's reporting windows are pure date math driven by the frequency."""
def make_digest(self, frequency, from_date="2026-06-15"):
doc = frappe.new_doc("Email Digest")
doc.frequency = frequency
doc.from_date = getdate(from_date)
doc.to_date = getdate(from_date)
return doc
def test_set_dates_daily_looks_back_one_day(self):
doc = self.make_digest("Daily")
doc.set_dates()
self.assertEqual(doc.past_from_date, getdate("2026-06-14"))
self.assertEqual(doc.past_to_date, getdate("2026-06-14"))
def test_set_dates_weekly_looks_back_one_week(self):
doc = self.make_digest("Weekly")
doc.set_dates()
self.assertEqual(doc.past_from_date, getdate("2026-06-08"))
self.assertEqual(doc.past_to_date, getdate("2026-06-14"))
def test_set_dates_monthly_looks_back_one_month(self):
doc = self.make_digest("Monthly")
doc.set_dates()
self.assertEqual(doc.past_from_date, getdate("2026-05-15"))
self.assertEqual(doc.past_to_date, getdate("2026-06-14"))
def test_weekly_window_is_the_previous_monday_to_sunday(self):
from_date, to_date = self.make_digest("Weekly").get_from_to_date()
self.assertEqual(from_date.weekday(), 0) # Monday
self.assertEqual((to_date - from_date).days, 6) # through Sunday
self.assertLess(to_date, now_datetime().date()) # entirely in the past

View File

@@ -432,7 +432,7 @@ def deactivate_sales_person(status: str, employee: str):
frappe.db.set_value("Sales Person", sales_person, "enabled", 0)
@frappe.whitelist()
@frappe.whitelist(methods=["POST"])
def create_user(employee: str, email: str | None = None, create_user_permission: int = 0) -> str:
emp = frappe.get_doc("Employee", employee)
emp.check_permission("write")

View File

@@ -5,16 +5,19 @@
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"defaults_section",
"default_company",
"country",
"default_distance_unit",
"column_break_8",
"default_currency",
"default_distance_unit",
"demo_company",
"general_settings_section",
"hide_currency_symbol",
"disable_rounded_total",
"disable_in_words",
"use_posting_datetime_for_naming_documents",
"demo_company"
"column_break_hnew",
"use_posting_datetime_for_naming_documents"
],
"fields": [
{
@@ -27,7 +30,7 @@
{
"fieldname": "country",
"fieldtype": "Link",
"label": "Country",
"label": "Default Country",
"options": "Country"
},
{
@@ -51,12 +54,12 @@
"reqd": 1
},
{
"default": "0",
"description": "Do not show any symbol like $ etc next to currencies.",
"fieldname": "hide_currency_symbol",
"fieldtype": "Select",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Hide Currency Symbol",
"options": "\nNo\nYes"
"label": "Hide Currency Symbol"
},
{
"default": "0",
@@ -83,21 +86,34 @@
"read_only": 1
},
{
"default": "0",
"description": "When checked, the system will use the posting datetime of the document for naming the document instead of the creation datetime of the document.",
"default": "1",
"description": "When checked, the system will use the posting date of the document for naming instead of the creation date.",
"fieldname": "use_posting_datetime_for_naming_documents",
"fieldtype": "Check",
"label": "Use Posting Datetime for Naming Documents"
"label": "Use Posting Date for Naming Documents"
},
{
"fieldname": "defaults_section",
"fieldtype": "Section Break",
"label": "Defaults"
},
{
"fieldname": "general_settings_section",
"fieldtype": "Section Break",
"label": "General Settings"
},
{
"fieldname": "column_break_hnew",
"fieldtype": "Column Break"
}
],
"grid_page_length": 50,
"hide_toolbar": 0,
"icon": "fa fa-cog",
"idx": 1,
"in_create": 1,
"issingle": 1,
"links": [],
"modified": "2026-03-16 13:28:20.155574",
"modified": "2026-07-22 15:28:19.250215",
"modified_by": "Administrator",
"module": "Setup",
"name": "Global Defaults",

View File

@@ -51,7 +51,7 @@ class GlobalDefaults(Document):
demo_company: DF.Link | None
disable_in_words: DF.Check
disable_rounded_total: DF.Check
hide_currency_symbol: DF.Literal["", "No", "Yes"]
hide_currency_symbol: DF.Check
use_posting_datetime_for_naming_documents: DF.Check
# end: auto-generated types

View File

@@ -75,6 +75,23 @@ frappe.ui.form.on("Item Group", {
},
};
};
["expenses_added_to_stock_account", "expenses_added_to_stock_contra_account"].forEach((field) => {
frm.fields_dict["item_group_defaults"].grid.get_field(field).get_query = function (
doc,
cdt,
cdn
) {
const row = locals[cdt][cdn];
return {
filters: {
root_type: "Expense",
company: row.company,
is_group: 0,
},
};
};
});
},
refresh: function (frm) {
@@ -174,6 +191,8 @@ const COMPANY_DEFAULTS_TO_VF = {
default_discount_account: "vf_default_discount_account",
default_supplier: "vf_default_supplier",
purchase_expense_contra_account: "vf_purchase_expense_contra_account",
expenses_added_to_stock_account: "vf_expenses_added_to_stock_account",
expenses_added_to_stock_contra_account: "vf_expenses_added_to_stock_contra_account",
};
const FIELD_DEFAULT_SOURCE = {
@@ -192,6 +211,8 @@ const FIELD_DEFAULT_SOURCE = {
default_discount_account: "Company",
default_supplier: null,
purchase_expense_contra_account: "Company",
expenses_added_to_stock_account: "Company",
expenses_added_to_stock_contra_account: "Company",
};
function populate_item_group_company_defaults(frm, cdt, cdn, row) {

View File

@@ -4,7 +4,7 @@
import frappe
from frappe import _
from frappe.utils.nestedset import NestedSet
from frappe.utils.nestedset import NestedSet, get_root_of
class ItemGroup(NestedSet):
@@ -32,8 +32,9 @@ class ItemGroup(NestedSet):
def validate(self):
if not self.parent_item_group and not frappe.in_test:
if frappe.db.exists("Item Group", _("All Item Groups")):
self.parent_item_group = _("All Item Groups")
root = get_root_of(self.doctype)
if root and root != self.name:
self.parent_item_group = root
self.validate_item_group_defaults()
self.check_item_tax()
@@ -126,6 +127,8 @@ def get_company_resolved_defaults(company: str) -> dict:
"deferred_revenue_account": company_doc.get("default_deferred_revenue_account"),
"default_discount_account": company_doc.get("default_discount_account"),
"purchase_expense_contra_account": company_doc.get("purchase_expense_contra_account"),
"expenses_added_to_stock_account": company_doc.get("expenses_added_to_stock_account"),
"expenses_added_to_stock_contra_account": company_doc.get("expenses_added_to_stock_contra_account"),
"default_price_list": "",
"default_supplier": "",
}

View File

@@ -30,7 +30,7 @@ class TermsandConditions(Document):
def validate(self):
if self.terms:
validate_template(self.terms)
validate_template(self.terms, restrict_globals=True)
if not cint(self.buying) and not cint(self.selling) and not cint(self.hr) and not cint(self.disabled):
throw(_("At least one of the Applicable Modules should be selected"))
@@ -39,7 +39,10 @@ class TermsandConditions(Document):
def get_terms_and_conditions(template_name: str, doc: str | dict):
doc = frappe.parse_json(doc)
terms_and_conditions = frappe.get_doc("Terms and Conditions", template_name)
tnc = frappe.get_cached_doc("Terms and Conditions", template_name)
tnc.check_permission()
if terms_and_conditions.terms:
return frappe.render_template(terms_and_conditions.terms, doc)
if not tnc.terms:
return
return frappe.render_template(tnc.terms, doc, restrict_globals=True)

View File

@@ -21,6 +21,8 @@ def after_install():
if not frappe.db.exists("Role", "Analytics"):
frappe.get_doc({"doctype": "Role", "role_name": "Analytics"}).insert()
create_shop_floor_roles()
set_single_defaults()
setup_repost_defaults()
create_print_setting_custom_fields()
@@ -50,6 +52,15 @@ def make_default_operations():
doc.insert(ignore_permissions=True)
def create_shop_floor_roles():
"""Roles that drive the Shop Floor page's two experiences (manager board vs operator view)."""
for role_name in ("Shop Floor Manager", "Shop Floor User"):
if not frappe.db.exists("Role", role_name):
frappe.get_doc({"doctype": "Role", "role_name": role_name, "desk_access": 1}).insert(
ignore_permissions=True
)
def set_single_defaults():
for dt in (
"Accounts Settings",
@@ -406,3 +417,19 @@ DEFAULT_ROLE_PROFILES = {
"Purchase Manager",
],
}
def after_app_install(app_name=None):
if app_name == "crm":
from erpnext.crm.frappe_crm_api import remove_allowed_users_on_crm_install
remove_allowed_users_on_crm_install()
def after_app_uninstall(app_name=None):
if app_name == "crm":
from erpnext.crm.frappe_crm_api import disable_frappe_crm_data_synchronization_on_crm_uninstall
disable_frappe_crm_data_synchronization_on_crm_uninstall()
frappe.db.commit() # nosemgrep

View File

@@ -8,7 +8,7 @@
"doctype": "Workspace",
"for_user": "",
"hide_custom": 0,
"icon": "setting",
"icon": "sliders-horizontal",
"idx": 0,
"is_hidden": 0,
"label": "ERPNext Settings",
@@ -69,7 +69,7 @@
"type": "Link"
}
],
"modified": "2026-06-14 13:43:50.429297",
"modified": "2026-07-14 12:00:00.000000",
"modified_by": "Administrator",
"module": "Setup",
"name": "ERPNext Settings",
@@ -97,7 +97,7 @@
"type": "DocType"
},
{
"icon": "accounting",
"icon": "wallet",
"label": "Accounts Settings",
"link_to": "Accounts Settings",
"type": "DocType"
@@ -110,19 +110,19 @@
"type": "DocType"
},
{
"icon": "stock",
"icon": "package",
"label": "Stock Settings",
"link_to": "Stock Settings",
"type": "DocType"
},
{
"icon": "sell",
"icon": "store",
"label": "Selling Settings",
"link_to": "Selling Settings",
"type": "DocType"
},
{
"icon": "buying",
"icon": "shopping-cart",
"label": "Buying Settings",
"link_to": "Buying Settings",
"type": "DocType"
@@ -158,7 +158,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "accounting",
"icon": "wallet",
"indent": 0,
"keep_closed": 0,
"label": "Accounts Settings",
@@ -184,7 +184,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "sell",
"icon": "store",
"indent": 0,
"keep_closed": 0,
"label": "Selling Settings",
@@ -197,7 +197,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "buying",
"icon": "shopping-cart",
"indent": 0,
"keep_closed": 0,
"label": "Buying Settings",
@@ -210,7 +210,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "stock",
"icon": "package",
"indent": 0,
"keep_closed": 0,
"label": "Stock Settings",
@@ -236,7 +236,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "projects",
"icon": "folder-kanban",
"indent": 0,
"keep_closed": 0,
"label": "Projects Settings",
@@ -249,7 +249,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "crm",
"icon": "handshake",
"indent": 0,
"keep_closed": 0,
"label": "CRM Settings",
@@ -262,7 +262,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "support",
"icon": "headset",
"indent": 0,
"keep_closed": 0,
"label": "Support Settings",
@@ -275,7 +275,7 @@
{
"child": 0,
"collapsible": 1,
"icon": "getting-started",
"icon": "rocket",
"indent": 1,
"keep_closed": 1,
"label": "Other Settings",
@@ -355,6 +355,116 @@
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"icon": "building-2",
"indent": 1,
"keep_closed": 1,
"label": "Organization",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Section Break"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 1,
"icon": "building-2",
"indent": 0,
"keep_closed": 0,
"label": "Company",
"link_to": "Company",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 0,
"icon": "book-text",
"indent": 0,
"keep_closed": 0,
"label": "Letter Head",
"link_to": "Letter Head",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 0,
"icon": "file-user",
"indent": 0,
"keep_closed": 0,
"label": "Department",
"link_to": "Department",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 0,
"icon": "book-user",
"indent": 0,
"keep_closed": 0,
"label": "Branch",
"link_to": "Branch",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 0,
"icon": "users",
"indent": 0,
"keep_closed": 0,
"label": "User",
"link_to": "User",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 0,
"icon": "user-round-check",
"indent": 0,
"keep_closed": 0,
"label": "Role Permissions",
"link_to": "permission-manager",
"link_type": "Page",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 1,
"collapsible": 1,
"default_workspace": 0,
"icon": "mail",
"indent": 0,
"keep_closed": 0,
"label": "Email Account",
"link_to": "Email Account",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
}
],
"standard": 1,

View File

@@ -8,19 +8,11 @@
"doctype": "Workspace",
"for_user": "",
"hide_custom": 0,
"icon": "home",
"icon": "house",
"idx": 0,
"is_hidden": 0,
"label": "Home",
"links": [
{
"hidden": 0,
"is_query_report": 0,
"label": "Accounting",
"link_count": 0,
"onboard": 0,
"type": "Card Break"
},
{
"hidden": 0,
"is_query_report": 0,
@@ -40,28 +32,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Chart of Accounts",
"link_count": 0,
"link_to": "Account",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Company",
"link_count": 0,
"link_to": "Company",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -84,28 +54,6 @@
"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": "Supplier",
"link_count": 0,
"link_to": "Supplier",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -125,14 +73,6 @@
"onboard": 0,
"type": "Card Break"
},
{
"hidden": 0,
"is_query_report": 0,
"label": "Stock",
"link_count": 0,
"onboard": 0,
"type": "Card Break"
},
{
"dependencies": "",
"hidden": 0,
@@ -144,28 +84,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Item",
"link_count": 0,
"link_to": "Item",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Warehouse",
"link_count": 0,
"link_to": "Warehouse",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -188,17 +106,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Brand",
"link_count": 0,
"link_to": "Brand",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -210,28 +117,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Unit of Measure (UOM)",
"link_count": 0,
"link_to": "UOM",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Stock Reconciliation",
"link_count": 0,
"link_to": "Stock Reconciliation",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -251,25 +136,6 @@
"onboard": 0,
"type": "Card Break"
},
{
"hidden": 0,
"is_query_report": 0,
"label": "CRM",
"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,
@@ -292,28 +158,6 @@
"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": "Territory",
"link_count": 0,
"link_to": "Territory",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -333,14 +177,6 @@
"onboard": 0,
"type": "Card Break"
},
{
"hidden": 0,
"is_query_report": 0,
"label": "Data Import and Settings",
"link_count": 0,
"onboard": 0,
"type": "Card Break"
},
{
"dependencies": "",
"hidden": 0,
@@ -352,28 +188,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Import Data",
"link_count": 0,
"link_to": "Data Import",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Opening Invoice Creation Tool",
"link_count": 0,
"link_to": "Opening Invoice Creation Tool",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -396,17 +210,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Chart of Accounts Importer",
"link_count": 0,
"link_to": "Chart of Accounts Importer",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -418,28 +221,6 @@
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Letter Head",
"link_count": 0,
"link_to": "Letter Head",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
"is_query_report": 0,
"label": "Email Account",
"link_count": 0,
"link_to": "Email Account",
"link_type": "DocType",
"onboard": 1,
"type": "Link"
},
{
"dependencies": "",
"hidden": 0,
@@ -452,7 +233,7 @@
"type": "Link"
}
],
"modified": "2026-07-01 14:22:16.927245",
"modified": "2026-07-17 07:55:00.592653",
"modified_by": "Administrator",
"module": "Setup",
"name": "Home",

View File

@@ -1,204 +0,0 @@
{
"allowed_users": [
{
"user": "Administrator"
},
{
"user": "Guest"
},
{
"user": "accounts@test.com"
},
{
"user": "ankush@erpnext.com"
},
{
"user": "faris@erpnext.com"
},
{
"user": "mention_test_user@example.com"
},
{
"user": "project@frappe.io"
},
{
"user": "rushabh@erpnext.com"
},
{
"user": "saqib@erpnext.com"
},
{
"user": "soham@frappe.io"
},
{
"user": "sohamengineer123@gmail.com"
},
{
"user": "sohamkulkarns9@gmail.com"
},
{
"user": "sydel@frappe.io"
},
{
"user": "test'5@example.com"
},
{
"user": "test1@example.com"
},
{
"user": "test2@example.com"
},
{
"user": "test3@example.com"
},
{
"user": "test4@example.com"
},
{
"user": "test@example.com"
},
{
"user": "test@portal.com"
},
{
"user": "testpassword@example.com"
},
{
"user": "testperm@example.com"
},
{
"user": "web@web.com"
}
],
"app": "erpnext",
"charts": [],
"content": "[]",
"creation": "2026-06-11 11:51:21.789012",
"custom_blocks": [],
"docstatus": 0,
"doctype": "Workspace",
"for_user": "",
"hide_custom": 0,
"icon": "organization",
"idx": 0,
"indicator_color": "green",
"is_hidden": 0,
"label": "Organization",
"link_type": "DocType",
"links": [],
"modified": "2026-06-16 00:45:57.595188",
"modified_by": "Administrator",
"module": "Setup",
"module_onboarding": "Organization Onboarding",
"name": "Organization",
"number_cards": [],
"owner": "Administrator",
"public": 1,
"quick_lists": [],
"roles": [],
"sequence_id": 46.0,
"shortcuts": [],
"sidebar_items": [
{
"child": 0,
"collapsible": 1,
"default_workspace": 1,
"icon": "organization",
"indent": 0,
"keep_closed": 0,
"label": "Company",
"link_to": "Company",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"default_workspace": 0,
"icon": "book-text",
"indent": 0,
"keep_closed": 0,
"label": "Letter Head",
"link_to": "Letter Head",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"default_workspace": 0,
"icon": "file-user",
"indent": 0,
"keep_closed": 0,
"label": "Department",
"link_to": "Department",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"default_workspace": 0,
"icon": "book-user",
"indent": 0,
"keep_closed": 0,
"label": "Branch",
"link_to": "Branch",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"default_workspace": 0,
"icon": "users",
"indent": 0,
"keep_closed": 0,
"label": "User",
"link_to": "User",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"default_workspace": 0,
"icon": "user-round-check",
"indent": 0,
"keep_closed": 0,
"label": "Role Permissions",
"link_to": "permission-manager",
"link_type": "Page",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
},
{
"child": 0,
"collapsible": 1,
"default_workspace": 0,
"icon": "mail",
"indent": 0,
"keep_closed": 0,
"label": "Email Account",
"link_to": "Email Account",
"link_type": "DocType",
"open_in_new_tab": 0,
"show_arrow": 0,
"type": "Link"
}
],
"standard": 1,
"title": "Organization",
"type": "Workspace"
}