${format_currency(item_data.amount, currency)}
${format_currency(item_data.rate, currency)}
@@ -618,7 +618,7 @@ erpnext.PointOfSale.ItemCart = class {
} else {
return `
-
${item_data.qty || 0}
+
${item_data.qty || 0} ${item_data.uom}
${format_currency(item_data.rate, currency)}
diff --git a/erpnext/selling/page/point_of_sale/pos_item_selector.js b/erpnext/selling/page/point_of_sale/pos_item_selector.js
index b5eb0489f9d..ec67bdfd9dd 100644
--- a/erpnext/selling/page/point_of_sale/pos_item_selector.js
+++ b/erpnext/selling/page/point_of_sale/pos_item_selector.js
@@ -78,7 +78,7 @@ erpnext.PointOfSale.ItemSelector = class {
get_item_html(item) {
const me = this;
// eslint-disable-next-line no-unused-vars
- const { item_image, serial_no, batch_no, barcode, actual_qty, stock_uom, price_list_rate } = item;
+ const { item_image, serial_no, batch_no, barcode, actual_qty, uom, price_list_rate } = item;
const precision = flt(price_list_rate, 2) % 1 != 0 ? 2 : 0;
let indicator_color;
let qty_to_display = actual_qty;
@@ -118,7 +118,7 @@ erpnext.PointOfSale.ItemSelector = class {
return (
`
@@ -128,7 +128,7 @@ erpnext.PointOfSale.ItemSelector = class {
${frappe.ellipsis(item.item_name, 18)}
-
${format_currency(price_list_rate, item.currency, precision) || 0}
+
${format_currency(price_list_rate, item.currency, precision) || 0} / ${uom}
`
);
diff --git a/erpnext/selling/page/point_of_sale/pos_past_order_summary.js b/erpnext/selling/page/point_of_sale/pos_past_order_summary.js
index 40165c3484f..be75bd64cfd 100644
--- a/erpnext/selling/page/point_of_sale/pos_past_order_summary.js
+++ b/erpnext/selling/page/point_of_sale/pos_past_order_summary.js
@@ -94,7 +94,7 @@ erpnext.PointOfSale.PastOrderSummary = class {
get_item_html(doc, item_data) {
return `
${item_data.item_name}
-
${item_data.qty || 0}
+
${item_data.qty || 0} ${item_data.uom}
${get_rate_discount_html()}
`;
diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
index e10df2acbb5..44c4d5497ba 100644
--- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
+++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py
@@ -41,8 +41,20 @@ def get_columns(filters):
{"label": _("Description"), "fieldtype": "Data", "fieldname": "description", "width": 150},
{"label": _("Quantity"), "fieldtype": "Float", "fieldname": "quantity", "width": 150},
{"label": _("UOM"), "fieldtype": "Link", "fieldname": "uom", "options": "UOM", "width": 100},
- {"label": _("Rate"), "fieldname": "rate", "options": "Currency", "width": 120},
- {"label": _("Amount"), "fieldname": "amount", "options": "Currency", "width": 120},
+ {
+ "label": _("Rate"),
+ "fieldname": "rate",
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 120,
+ },
+ {
+ "label": _("Amount"),
+ "fieldname": "amount",
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 120,
+ },
{
"label": _("Sales Order"),
"fieldtype": "Link",
@@ -93,8 +105,9 @@ def get_columns(filters):
},
{
"label": _("Billed Amount"),
- "fieldtype": "currency",
+ "fieldtype": "Currency",
"fieldname": "billed_amount",
+ "options": "currency",
"width": 120,
},
{
@@ -104,6 +117,13 @@ def get_columns(filters):
"options": "Company",
"width": 100,
},
+ {
+ "label": _("Currency"),
+ "fieldtype": "Link",
+ "fieldname": "currency",
+ "options": "Currency",
+ "hidden": 1,
+ },
]
@@ -141,31 +161,12 @@ def get_data(filters):
"billed_amount": flt(record.get("billed_amt")),
"company": record.get("company"),
}
+ row["currency"] = frappe.get_cached_value("Company", row["company"], "default_currency")
data.append(row)
return data
-def get_conditions(filters):
- conditions = ""
- if filters.get("item_group"):
- conditions += "AND so_item.item_group = %s" % frappe.db.escape(filters.item_group)
-
- if filters.get("from_date"):
- conditions += "AND so.transaction_date >= '%s'" % filters.from_date
-
- if filters.get("to_date"):
- conditions += "AND so.transaction_date <= '%s'" % filters.to_date
-
- if filters.get("item_code"):
- conditions += "AND so_item.item_code = %s" % frappe.db.escape(filters.item_code)
-
- if filters.get("customer"):
- conditions += "AND so.customer = %s" % frappe.db.escape(filters.customer)
-
- return conditions
-
-
def get_customer_details():
details = frappe.get_all("Customer", fields=["name", "customer_name", "customer_group"])
customer_details = {}
@@ -187,29 +188,50 @@ def get_item_details():
def get_sales_order_details(company_list, filters):
- conditions = get_conditions(filters)
+ db_so = frappe.qb.DocType("Sales Order")
+ db_so_item = frappe.qb.DocType("Sales Order Item")
- return frappe.db.sql(
- """
- SELECT
- so_item.item_code, so_item.description, so_item.qty,
- so_item.uom, so_item.base_rate, so_item.base_amount,
- so.name, so.transaction_date, so.customer,so.territory,
- so.project, so_item.delivered_qty,
- so_item.billed_amt, so.company
- FROM
- `tabSales Order` so, `tabSales Order Item` so_item
- WHERE
- so.name = so_item.parent
- AND so.company in ({0})
- AND so.docstatus = 1 {1}
- """.format(
- ",".join(["%s"] * len(company_list)), conditions
- ),
- tuple(company_list),
- as_dict=1,
+ query = (
+ frappe.qb.from_(db_so)
+ .inner_join(db_so_item)
+ .on(db_so_item.parent == db_so.name)
+ .select(
+ db_so.name,
+ db_so.customer,
+ db_so.transaction_date,
+ db_so.territory,
+ db_so.project,
+ db_so.company,
+ db_so_item.item_code,
+ db_so_item.description,
+ db_so_item.qty,
+ db_so_item.uom,
+ db_so_item.base_rate,
+ db_so_item.base_amount,
+ db_so_item.delivered_qty,
+ (db_so_item.billed_amt * db_so.conversion_rate).as_("billed_amt"),
+ )
+ .where(db_so.docstatus == 1)
+ .where(db_so.company.isin(tuple(company_list)))
)
+ if filters.get("item_group"):
+ query = query.where(db_so_item.item_group == frappe.db.escape(filters.item_group))
+
+ if filters.get("from_date"):
+ query = query.where(db_so.transaction_date >= filters.from_date)
+
+ if filters.get("to_date"):
+ query = query.where(db_so.transaction_date <= filters.to_date)
+
+ if filters.get("item_code"):
+ query = query.where(db_so_item.item_group == frappe.db.escape(filters.item_code))
+
+ if filters.get("customer"):
+ query = query.where(db_so.customer == filters.customer)
+
+ return query.run(as_dict=1)
+
def get_chart_data(data):
item_wise_sales_map = {}
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 95bbf84616b..2fdfcf647d0 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -148,12 +148,12 @@ def get_item_for_list_in_html(context):
def get_parent_item_groups(item_group_name, from_item=False):
- base_nav_page = {"name": _("Shop by Category"), "route": "/shop-by-category"}
+ base_nav_page = {"name": _("All Products"), "route": "/all-products"}
if from_item and frappe.request.environ.get("HTTP_REFERER"):
# base page after 'Home' will vary on Item page
last_page = frappe.request.environ["HTTP_REFERER"].split("/")[-1].split("?")[0]
- if last_page and last_page in ("shop-by-category", "all-products"):
+ if last_page and last_page == "shop-by-category":
base_nav_page_title = " ".join(last_page.split("-")).title()
base_nav_page = {"name": _(base_nav_page_title), "route": "/" + last_page}
diff --git a/erpnext/setup/setup_wizard/operations/company_setup.py b/erpnext/setup/setup_wizard/operations/company_setup.py
index aadc98989fa..ace5cca0b02 100644
--- a/erpnext/setup/setup_wizard/operations/company_setup.py
+++ b/erpnext/setup/setup_wizard/operations/company_setup.py
@@ -4,7 +4,6 @@
import frappe
from frappe import _
from frappe.utils import cstr, getdate
-from .default_website import website_maker
def create_fiscal_year_and_company(args):
@@ -48,83 +47,6 @@ def enable_shopping_cart(args): # nosemgrep
).insert()
-def create_email_digest():
- from frappe.utils.user import get_system_managers
-
- system_managers = get_system_managers(only_name=True)
-
- if not system_managers:
- return
-
- recipients = []
- for d in system_managers:
- recipients.append({"recipient": d})
-
- companies = frappe.db.sql_list("select name FROM `tabCompany`")
- for company in companies:
- if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company):
- edigest = frappe.get_doc(
- {
- "doctype": "Email Digest",
- "name": "Default Weekly Digest - " + company,
- "company": company,
- "frequency": "Weekly",
- "recipients": recipients,
- }
- )
-
- for df in edigest.meta.get("fields", {"fieldtype": "Check"}):
- if df.fieldname != "scheduler_errors":
- edigest.set(df.fieldname, 1)
-
- edigest.insert()
-
- # scheduler errors digest
- if companies:
- edigest = frappe.new_doc("Email Digest")
- edigest.update(
- {
- "name": "Scheduler Errors",
- "company": companies[0],
- "frequency": "Daily",
- "recipients": recipients,
- "scheduler_errors": 1,
- "enabled": 1,
- }
- )
- edigest.insert()
-
-
-def create_logo(args):
- if args.get("attach_logo"):
- attach_logo = args.get("attach_logo").split(",")
- if len(attach_logo) == 3:
- filename, filetype, content = attach_logo
- _file = frappe.get_doc(
- {
- "doctype": "File",
- "file_name": filename,
- "attached_to_doctype": "Website Settings",
- "attached_to_name": "Website Settings",
- "decode": True,
- }
- )
- _file.save()
- fileurl = _file.file_url
- frappe.db.set_value(
- "Website Settings",
- "Website Settings",
- "brand_html",
- "

{1}".format(
- fileurl, args.get("company_name")
- ),
- )
-
-
-def create_website(args):
- website_maker(args)
-
-
def get_fy_details(fy_start_date, fy_end_date):
start_year = getdate(fy_start_date).year
if start_year == getdate(fy_end_date).year:
diff --git a/erpnext/setup/setup_wizard/operations/default_website.py b/erpnext/setup/setup_wizard/operations/default_website.py
deleted file mode 100644
index 40b02b35dfd..00000000000
--- a/erpnext/setup/setup_wizard/operations/default_website.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-
-import frappe
-from frappe import _
-from frappe.utils import nowdate
-
-
-class website_maker(object):
- def __init__(self, args):
- self.args = args
- self.company = args.company_name
- self.tagline = args.company_tagline
- self.user = args.get("email")
- self.make_web_page()
- self.make_website_settings()
- self.make_blog()
-
- def make_web_page(self):
- # home page
- homepage = frappe.get_doc("Homepage", "Homepage")
- homepage.company = self.company
- homepage.tag_line = self.tagline
- homepage.setup_items()
- homepage.save()
-
- def make_website_settings(self):
- # update in home page in settings
- website_settings = frappe.get_doc("Website Settings", "Website Settings")
- website_settings.home_page = "home"
- website_settings.brand_html = self.company
- website_settings.copyright = self.company
- website_settings.top_bar_items = []
- website_settings.append(
- "top_bar_items", {"doctype": "Top Bar Item", "label": "Contact", "url": "/contact"}
- )
- website_settings.append(
- "top_bar_items", {"doctype": "Top Bar Item", "label": "Blog", "url": "/blog"}
- )
- website_settings.append(
- "top_bar_items", {"doctype": "Top Bar Item", "label": _("Products"), "url": "/all-products"}
- )
- website_settings.save()
-
- def make_blog(self):
- blog_category = frappe.get_doc(
- {"doctype": "Blog Category", "category_name": "general", "published": 1, "title": _("General")}
- ).insert()
-
- if not self.user:
- # Admin setup
- return
-
- blogger = frappe.new_doc("Blogger")
- user = frappe.get_doc("User", self.user)
- blogger.user = self.user
- blogger.full_name = user.first_name + (" " + user.last_name if user.last_name else "")
- blogger.short_name = user.first_name.lower()
- blogger.avatar = user.user_image
- blogger.insert()
-
- frappe.get_doc(
- {
- "doctype": "Blog Post",
- "title": "Welcome",
- "published": 1,
- "published_on": nowdate(),
- "blogger": blogger.name,
- "blog_category": blog_category.name,
- "blog_intro": "My First Blog",
- "content": frappe.get_template("setup/setup_wizard/data/sample_blog_post.html").render(),
- }
- ).insert()
-
-
-def test():
- frappe.delete_doc("Web Page", "test-company")
- frappe.delete_doc("Blog Post", "welcome")
- frappe.delete_doc("Blogger", "administrator")
- frappe.delete_doc("Blog Category", "general")
- website_maker(
- {
- "company": "Test Company",
- "company_tagline": "Better Tools for Everyone",
- "name": "Administrator",
- }
- )
- frappe.db.commit()
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index bd86a5b9693..65b268e385c 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -5,7 +5,6 @@
import frappe
from frappe import _
-from .operations import company_setup
from .operations import install_fixtures as fixtures
@@ -35,7 +34,6 @@ def get_setup_stages(args=None):
"fail_msg": "Failed to set defaults",
"tasks": [
{"fn": setup_defaults, "args": args, "fail_msg": _("Failed to setup defaults")},
- {"fn": stage_four, "args": args, "fail_msg": _("Failed to create website")},
],
},
{
@@ -60,12 +58,6 @@ def setup_defaults(args):
fixtures.install_defaults(frappe._dict(args))
-def stage_four(args):
- company_setup.create_website(args)
- company_setup.create_email_digest()
- company_setup.create_logo(args)
-
-
def fin(args):
frappe.local.message_log = []
login_as_first_user(args)
@@ -81,5 +73,4 @@ def setup_complete(args=None):
stage_fixtures(args)
setup_company(args)
setup_defaults(args)
- stage_four(args)
fin(args)
diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py
index 9f409d4b96a..72654e6f816 100644
--- a/erpnext/stock/doctype/bin/bin.py
+++ b/erpnext/stock/doctype/bin/bin.py
@@ -159,13 +159,18 @@ def update_qty(bin_name, args):
last_sle_qty = (
frappe.qb.from_(sle)
.select(sle.qty_after_transaction)
- .where((sle.item_code == args.get("item_code")) & (sle.warehouse == args.get("warehouse")))
+ .where(
+ (sle.item_code == args.get("item_code"))
+ & (sle.warehouse == args.get("warehouse"))
+ & (sle.is_cancelled == 0)
+ )
.orderby(CombineDatetime(sle.posting_date, sle.posting_time), order=Order.desc)
.orderby(sle.creation, order=Order.desc)
.limit(1)
.run()
)
+ actual_qty = 0.0
if last_sle_qty:
actual_qty = last_sle_qty[0][0]
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index a1df764ea9d..9f9f5cbe2a4 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -228,6 +228,7 @@ class DeliveryNote(SellingController):
def on_submit(self):
self.validate_packed_qty()
+ self.update_pick_list_status()
# Check for Approving Authority
frappe.get_doc("Authorization Control").validate_approving_authority(
@@ -313,6 +314,11 @@ class DeliveryNote(SellingController):
if has_error:
raise frappe.ValidationError
+ def update_pick_list_status(self):
+ from erpnext.stock.doctype.pick_list.pick_list import update_pick_list_status
+
+ update_pick_list_status(self.pick_list)
+
def check_next_docstatus(self):
submit_rv = frappe.db.sql(
"""select t1.name
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index d747383d6a5..903e2af3cb3 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -490,6 +490,46 @@ class TestDeliveryNote(FrappeTestCase):
self.assertEqual(gle_warehouse_amount, 1400)
+ def test_bin_details_of_packed_item(self):
+ from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle
+ from erpnext.stock.doctype.item.test_item import make_item
+
+ # test Update Items with product bundle
+ if not frappe.db.exists("Item", "_Test Product Bundle Item New"):
+ bundle_item = make_item("_Test Product Bundle Item New", {"is_stock_item": 0})
+ bundle_item.append(
+ "item_defaults", {"company": "_Test Company", "default_warehouse": "_Test Warehouse - _TC"}
+ )
+ bundle_item.save(ignore_permissions=True)
+
+ make_item("_Packed Item New 1", {"is_stock_item": 1})
+ make_product_bundle("_Test Product Bundle Item New", ["_Packed Item New 1"], 2)
+
+ si = create_delivery_note(
+ item_code="_Test Product Bundle Item New",
+ update_stock=1,
+ warehouse="_Test Warehouse - _TC",
+ transaction_date=add_days(nowdate(), -1),
+ do_not_submit=1,
+ )
+
+ make_stock_entry(item="_Packed Item New 1", target="_Test Warehouse - _TC", qty=120, rate=100)
+
+ bin_details = frappe.db.get_value(
+ "Bin",
+ {"item_code": "_Packed Item New 1", "warehouse": "_Test Warehouse - _TC"},
+ ["actual_qty", "projected_qty", "ordered_qty"],
+ as_dict=1,
+ )
+
+ si.transaction_date = nowdate()
+ si.save()
+
+ packed_item = si.packed_items[0]
+ self.assertEqual(flt(bin_details.actual_qty), flt(packed_item.actual_qty))
+ self.assertEqual(flt(bin_details.projected_qty), flt(packed_item.projected_qty))
+ self.assertEqual(flt(bin_details.ordered_qty), flt(packed_item.ordered_qty))
+
def test_return_for_serialized_items(self):
se = make_serialized_item()
serial_no = get_serial_nos(se.get("items")[0].serial_no)[0]
@@ -650,6 +690,11 @@ class TestDeliveryNote(FrappeTestCase):
update_delivery_note_status(dn.name, "Closed")
self.assertEqual(frappe.db.get_value("Delivery Note", dn.name, "Status"), "Closed")
+ # Check cancelling closed delivery note
+ dn.load_from_db()
+ dn.cancel()
+ self.assertEqual(dn.status, "Cancelled")
+
def test_dn_billing_status_case1(self):
# SO -> DN -> SI
so = make_sales_order()
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js
index ba1023ac691..0310682a2c1 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js
@@ -37,7 +37,7 @@ frappe.ui.form.on('Inventory Dimension', {
if (frm.doc.__onload && frm.doc.__onload.has_stock_ledger
&& frm.doc.__onload.has_stock_ledger.length) {
let allow_to_edit_fields = ['disabled', 'fetch_from_parent',
- 'type_of_transaction', 'condition'];
+ 'type_of_transaction', 'condition', 'mandatory_depends_on'];
frm.fields.forEach((field) => {
if (!in_list(allow_to_edit_fields, field.df.fieldname)) {
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.json b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.json
index 4397e11f540..eb6102a436e 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.json
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.json
@@ -24,6 +24,9 @@
"istable",
"applicable_condition_example_section",
"condition",
+ "conditional_mandatory_section",
+ "reqd",
+ "mandatory_depends_on",
"conditional_rule_examples_section",
"html_19"
],
@@ -153,11 +156,28 @@
"fieldname": "conditional_rule_examples_section",
"fieldtype": "Section Break",
"label": "Conditional Rule Examples"
+ },
+ {
+ "description": "To apply condition on parent field use parent.field_name and to apply condition on child table use doc.field_name. Here field_name could be based on the actual column name of the respective field.",
+ "fieldname": "mandatory_depends_on",
+ "fieldtype": "Small Text",
+ "label": "Mandatory Depends On"
+ },
+ {
+ "fieldname": "conditional_mandatory_section",
+ "fieldtype": "Section Break",
+ "label": "Mandatory Section"
+ },
+ {
+ "default": "0",
+ "fieldname": "reqd",
+ "fieldtype": "Check",
+ "label": "Mandatory"
}
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2022-11-15 15:50:16.767105",
+ "modified": "2023-01-31 13:44:38.507698",
"modified_by": "Administrator",
"module": "Stock",
"name": "Inventory Dimension",
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
index 009548abf26..db2b5d0a6b6 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
@@ -126,6 +126,8 @@ class InventoryDimension(Document):
insert_after="inventory_dimension",
options=self.reference_document,
label=self.dimension_name,
+ reqd=self.reqd,
+ mandatory_depends_on=self.mandatory_depends_on,
),
]
@@ -142,6 +144,8 @@ class InventoryDimension(Document):
"Custom Field", {"dt": "Stock Ledger Entry", "fieldname": self.target_fieldname}
) and not field_exists("Stock Ledger Entry", self.target_fieldname):
dimension_field = dimension_fields[1]
+ dimension_field["mandatory_depends_on"] = ""
+ dimension_field["reqd"] = 0
dimension_field["fieldname"] = self.target_fieldname
custom_fields["Stock Ledger Entry"] = dimension_field
diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
index edff3fd556c..28b1ed96f0d 100644
--- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
@@ -85,6 +85,9 @@ class TestInventoryDimension(FrappeTestCase):
condition="parent.purpose == 'Material Issue'",
)
+ inv_dim1.reqd = 0
+ inv_dim1.save()
+
create_inventory_dimension(
reference_document="Shelf",
type_of_transaction="Inward",
@@ -205,6 +208,48 @@ class TestInventoryDimension(FrappeTestCase):
)
)
+ def test_check_mandatory_dimensions(self):
+ doc = create_inventory_dimension(
+ reference_document="Pallet",
+ type_of_transaction="Outward",
+ dimension_name="Pallet",
+ apply_to_all_doctypes=0,
+ document_type="Stock Entry Detail",
+ )
+
+ doc.reqd = 1
+ doc.save()
+
+ self.assertTrue(
+ frappe.db.get_value(
+ "Custom Field", {"fieldname": "pallet", "dt": "Stock Entry Detail", "reqd": 1}, "name"
+ )
+ )
+
+ doc.load_from_db
+ doc.reqd = 0
+ doc.save()
+
+ def test_check_mandatory_depends_on_dimensions(self):
+ doc = create_inventory_dimension(
+ reference_document="Pallet",
+ type_of_transaction="Outward",
+ dimension_name="Pallet",
+ apply_to_all_doctypes=0,
+ document_type="Stock Entry Detail",
+ )
+
+ doc.mandatory_depends_on = "t_warehouse"
+ doc.save()
+
+ self.assertTrue(
+ frappe.db.get_value(
+ "Custom Field",
+ {"fieldname": "pallet", "dt": "Stock Entry Detail", "mandatory_depends_on": "t_warehouse"},
+ "name",
+ )
+ )
+
def prepare_test_data():
if not frappe.db.exists("DocType", "Shelf"):
@@ -251,6 +296,22 @@ def prepare_test_data():
create_warehouse("Rack Warehouse")
+ if not frappe.db.exists("DocType", "Pallet"):
+ frappe.get_doc(
+ {
+ "doctype": "DocType",
+ "name": "Pallet",
+ "module": "Stock",
+ "custom": 1,
+ "naming_rule": "By fieldname",
+ "autoname": "field:pallet_name",
+ "fields": [{"label": "Pallet Name", "fieldname": "pallet_name", "fieldtype": "Data"}],
+ "permissions": [
+ {"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
+ ],
+ }
+ ).insert(ignore_permissions=True)
+
def create_inventory_dimension(**args):
args = frappe._dict(args)
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index e61f0f514e3..5bcb05aa988 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -894,6 +894,12 @@ function open_form(frm, doctype, child_doctype, parentfield) {
new_child_doc.uom = frm.doc.stock_uom;
new_child_doc.description = frm.doc.description;
- frappe.ui.form.make_quick_entry(doctype, null, null, new_doc);
+ frappe.run_serially([
+ () => frappe.ui.form.make_quick_entry(doctype, null, null, new_doc),
+ () => {
+ frappe.flags.ignore_company_party_validation = true;
+ frappe.model.trigger("item_code", frm.doc.name, new_child_doc);
+ }
+ ])
});
}
diff --git a/erpnext/stock/doctype/item_attribute/item_attribute.py b/erpnext/stock/doctype/item_attribute/item_attribute.py
index 391ff06918a..ac4c313e28a 100644
--- a/erpnext/stock/doctype/item_attribute/item_attribute.py
+++ b/erpnext/stock/doctype/item_attribute/item_attribute.py
@@ -74,11 +74,10 @@ class ItemAttribute(Document):
def validate_duplication(self):
values, abbrs = [], []
for d in self.item_attribute_values:
- d.abbr = d.abbr.upper()
- if d.attribute_value in values:
- frappe.throw(_("{0} must appear only once").format(d.attribute_value))
+ if d.attribute_value.lower() in map(str.lower, values):
+ frappe.throw(_("Attribute value: {0} must appear only once").format(d.attribute_value.title()))
values.append(d.attribute_value)
- if d.abbr in abbrs:
- frappe.throw(_("{0} must appear only once").format(d.abbr))
+ if d.abbr.lower() in map(str.lower, abbrs):
+ frappe.throw(_("Abbreviation: {0} must appear only once").format(d.abbr.title()))
abbrs.append(d.abbr)
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 5f05de6991b..156e5917f23 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -366,10 +366,11 @@ frappe.ui.form.on('Material Request', {
frappe.ui.form.on("Material Request Item", {
qty: function (frm, doctype, name) {
- var d = locals[doctype][name];
- if (flt(d.qty) < flt(d.min_order_qty)) {
+ const item = locals[doctype][name];
+ if (flt(item.qty) < flt(item.min_order_qty)) {
frappe.msgprint(__("Warning: Material Requested Qty is less than Minimum Order Qty"));
}
+ frm.events.get_item_data(frm, item, false);
},
from_warehouse: function(frm, doctype, name) {
diff --git a/erpnext/stock/doctype/pick_list/pick_list.json b/erpnext/stock/doctype/pick_list/pick_list.json
index e1c3f0f5061..7259dc00a81 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.json
+++ b/erpnext/stock/doctype/pick_list/pick_list.json
@@ -26,7 +26,8 @@
"locations",
"amended_from",
"print_settings_section",
- "group_same_items"
+ "group_same_items",
+ "status"
],
"fields": [
{
@@ -168,11 +169,26 @@
"fieldtype": "Data",
"label": "Customer Name",
"read_only": 1
+ },
+ {
+ "default": "Draft",
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "hidden": 1,
+ "in_standard_filter": 1,
+ "label": "Status",
+ "no_copy": 1,
+ "options": "Draft\nOpen\nCompleted\nCancelled",
+ "print_hide": 1,
+ "read_only": 1,
+ "report_hide": 1,
+ "reqd": 1,
+ "search_index": 1
}
],
"is_submittable": 1,
"links": [],
- "modified": "2022-07-19 11:03:04.442174",
+ "modified": "2023-01-24 10:33:43.244476",
"modified_by": "Administrator",
"module": "Stock",
"name": "Pick List",
@@ -244,4 +260,4 @@
"sort_order": "DESC",
"states": [],
"track_changes": 1
-}
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index 9c6f4f4a352..bf3b5ddc54a 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -11,7 +11,8 @@ from frappe import _
from frappe.model.document import Document
from frappe.model.mapper import map_child_doc
from frappe.query_builder import Case
-from frappe.query_builder.functions import Locate
+from frappe.query_builder.custom import GROUP_CONCAT
+from frappe.query_builder.functions import Coalesce, IfNull, Locate, Replace, Sum
from frappe.utils import cint, floor, flt, today
from frappe.utils.nestedset import get_descendants_of
@@ -77,15 +78,32 @@ class PickList(Document):
)
def on_submit(self):
+ self.update_status()
self.update_bundle_picked_qty()
self.update_reference_qty()
self.update_sales_order_picking_status()
def on_cancel(self):
+ self.update_status()
self.update_bundle_picked_qty()
self.update_reference_qty()
self.update_sales_order_picking_status()
+ def update_status(self, status=None, update_modified=True):
+ if not status:
+ if self.docstatus == 0:
+ status = "Draft"
+ elif self.docstatus == 1:
+ if self.status == "Draft":
+ status = "Open"
+ elif target_document_exists(self.name, self.purpose):
+ status = "Completed"
+ elif self.docstatus == 2:
+ status = "Cancelled"
+
+ if status:
+ frappe.db.set_value("Pick List", self.name, "status", status, update_modified=update_modified)
+
def update_reference_qty(self):
packed_items = []
so_items = []
@@ -162,6 +180,7 @@ class PickList(Document):
def set_item_locations(self, save=False):
self.validate_for_qty()
items = self.aggregate_item_qty()
+ picked_items_details = self.get_picked_items_details(items)
self.item_location_map = frappe._dict()
from_warehouses = None
@@ -180,7 +199,11 @@ class PickList(Document):
self.item_location_map.setdefault(
item_code,
get_available_item_locations(
- item_code, from_warehouses, self.item_count_map.get(item_code), self.company
+ item_code,
+ from_warehouses,
+ self.item_count_map.get(item_code),
+ self.company,
+ picked_item_details=picked_items_details.get(item_code),
),
)
@@ -309,6 +332,56 @@ class PickList(Document):
already_picked + (picked_qty * (1 if self.docstatus == 1 else -1)),
)
+ def get_picked_items_details(self, items):
+ picked_items = frappe._dict()
+
+ if items:
+ pi = frappe.qb.DocType("Pick List")
+ pi_item = frappe.qb.DocType("Pick List Item")
+ query = (
+ frappe.qb.from_(pi)
+ .inner_join(pi_item)
+ .on(pi.name == pi_item.parent)
+ .select(
+ pi_item.item_code,
+ pi_item.warehouse,
+ pi_item.batch_no,
+ Sum(Case().when(pi_item.picked_qty > 0, pi_item.picked_qty).else_(pi_item.stock_qty)).as_(
+ "picked_qty"
+ ),
+ Replace(GROUP_CONCAT(pi_item.serial_no), ",", "\n").as_("serial_no"),
+ )
+ .where(
+ (pi_item.item_code.isin([x.item_code for x in items]))
+ & ((pi_item.picked_qty > 0) | (pi_item.stock_qty > 0))
+ & (pi.status != "Completed")
+ & (pi_item.docstatus != 2)
+ )
+ .groupby(
+ pi_item.item_code,
+ pi_item.warehouse,
+ pi_item.batch_no,
+ )
+ )
+
+ if self.name:
+ query = query.where(pi_item.parent != self.name)
+
+ items_data = query.run(as_dict=True)
+
+ for item_data in items_data:
+ key = (item_data.warehouse, item_data.batch_no) if item_data.batch_no else item_data.warehouse
+ serial_no = [x for x in item_data.serial_no.split("\n") if x] if item_data.serial_no else None
+ data = {"picked_qty": item_data.picked_qty}
+ if serial_no:
+ data["serial_no"] = serial_no
+ if item_data.item_code not in picked_items:
+ picked_items[item_data.item_code] = {key: data}
+ else:
+ picked_items[item_data.item_code][key] = data
+
+ return picked_items
+
def _get_product_bundles(self) -> Dict[str, str]:
# Dict[so_item_row: item_code]
product_bundles = {}
@@ -346,29 +419,30 @@ class PickList(Document):
return int(flt(min(possible_bundles), precision or 6))
+def update_pick_list_status(pick_list):
+ if pick_list:
+ doc = frappe.get_doc("Pick List", pick_list)
+ doc.run_method("update_status")
+
+
def get_picked_items_qty(items) -> List[Dict]:
- return frappe.db.sql(
- f"""
- SELECT
- sales_order_item,
- item_code,
- sales_order,
- SUM(stock_qty) AS stock_qty,
- SUM(picked_qty) AS picked_qty
- FROM
- `tabPick List Item`
- WHERE
- sales_order_item IN (
- {", ".join(frappe.db.escape(d) for d in items)}
- )
- AND docstatus = 1
- GROUP BY
- sales_order_item,
- sales_order
- FOR UPDATE
- """,
- as_dict=1,
- )
+ pi_item = frappe.qb.DocType("Pick List Item")
+ return (
+ frappe.qb.from_(pi_item)
+ .select(
+ pi_item.sales_order_item,
+ pi_item.item_code,
+ pi_item.sales_order,
+ Sum(pi_item.stock_qty).as_("stock_qty"),
+ Sum(pi_item.picked_qty).as_("picked_qty"),
+ )
+ .where((pi_item.docstatus == 1) & (pi_item.sales_order_item.isin(items)))
+ .groupby(
+ pi_item.sales_order_item,
+ pi_item.sales_order,
+ )
+ .for_update()
+ ).run(as_dict=True)
def validate_item_locations(pick_list):
@@ -434,31 +508,38 @@ def get_items_with_location_and_quantity(item_doc, item_location_map, docstatus)
def get_available_item_locations(
- item_code, from_warehouses, required_qty, company, ignore_validation=False
+ item_code,
+ from_warehouses,
+ required_qty,
+ company,
+ ignore_validation=False,
+ picked_item_details=None,
):
locations = []
+ total_picked_qty = (
+ sum([v.get("picked_qty") for k, v in picked_item_details.items()]) if picked_item_details else 0
+ )
has_serial_no = frappe.get_cached_value("Item", item_code, "has_serial_no")
has_batch_no = frappe.get_cached_value("Item", item_code, "has_batch_no")
if has_batch_no and has_serial_no:
locations = get_available_item_locations_for_serial_and_batched_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty
)
elif has_serial_no:
locations = get_available_item_locations_for_serialized_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty
)
elif has_batch_no:
locations = get_available_item_locations_for_batched_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty
)
else:
locations = get_available_item_locations_for_other_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty
)
total_qty_available = sum(location.get("qty") for location in locations)
-
remaining_qty = required_qty - total_qty_available
if remaining_qty > 0 and not ignore_validation:
@@ -469,25 +550,60 @@ def get_available_item_locations(
title=_("Insufficient Stock"),
)
+ if picked_item_details:
+ for location in list(locations):
+ key = (
+ (location["warehouse"], location["batch_no"])
+ if location.get("batch_no")
+ else location["warehouse"]
+ )
+
+ if key in picked_item_details:
+ picked_detail = picked_item_details[key]
+
+ if picked_detail.get("serial_no") and location.get("serial_no"):
+ location["serial_no"] = list(
+ set(location["serial_no"]).difference(set(picked_detail["serial_no"]))
+ )
+ location["qty"] = len(location["serial_no"])
+ else:
+ location["qty"] -= picked_detail.get("picked_qty")
+
+ if location["qty"] < 1:
+ locations.remove(location)
+
+ total_qty_available = sum(location.get("qty") for location in locations)
+ remaining_qty = required_qty - total_qty_available
+
+ if remaining_qty > 0 and not ignore_validation:
+ frappe.msgprint(
+ _("{0} units of Item {1} is picked in another Pick List.").format(
+ remaining_qty, frappe.get_desk_link("Item", item_code)
+ ),
+ title=_("Already Picked"),
+ )
+
return locations
def get_available_item_locations_for_serialized_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty=0
):
- filters = frappe._dict({"item_code": item_code, "company": company, "warehouse": ["!=", ""]})
+ sn = frappe.qb.DocType("Serial No")
+ query = (
+ frappe.qb.from_(sn)
+ .select(sn.name, sn.warehouse)
+ .where((sn.item_code == item_code) & (sn.company == company))
+ .orderby(sn.purchase_date)
+ .limit(cint(required_qty + total_picked_qty))
+ )
if from_warehouses:
- filters.warehouse = ["in", from_warehouses]
+ query = query.where(sn.warehouse.isin(from_warehouses))
+ else:
+ query = query.where(Coalesce(sn.warehouse, "") != "")
- serial_nos = frappe.get_all(
- "Serial No",
- fields=["name", "warehouse"],
- filters=filters,
- limit=required_qty,
- order_by="purchase_date",
- as_list=1,
- )
+ serial_nos = query.run(as_list=True)
warehouse_serial_nos_map = frappe._dict()
for serial_no, warehouse in serial_nos:
@@ -501,94 +617,88 @@ def get_available_item_locations_for_serialized_item(
def get_available_item_locations_for_batched_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty=0
):
- warehouse_condition = "and warehouse in %(warehouses)s" if from_warehouses else ""
- batch_locations = frappe.db.sql(
- """
- SELECT
- sle.`warehouse`,
- sle.`batch_no`,
- SUM(sle.`actual_qty`) AS `qty`
- FROM
- `tabStock Ledger Entry` sle, `tabBatch` batch
- WHERE
- sle.batch_no = batch.name
- and sle.`item_code`=%(item_code)s
- and sle.`company` = %(company)s
- and batch.disabled = 0
- and sle.is_cancelled=0
- and IFNULL(batch.`expiry_date`, '2200-01-01') > %(today)s
- {warehouse_condition}
- GROUP BY
- sle.`warehouse`,
- sle.`batch_no`,
- sle.`item_code`
- HAVING `qty` > 0
- ORDER BY IFNULL(batch.`expiry_date`, '2200-01-01'), batch.`creation`, sle.`batch_no`, sle.`warehouse`
- """.format(
- warehouse_condition=warehouse_condition
- ),
- { # nosec
- "item_code": item_code,
- "company": company,
- "today": today(),
- "warehouses": from_warehouses,
- },
- as_dict=1,
+ sle = frappe.qb.DocType("Stock Ledger Entry")
+ batch = frappe.qb.DocType("Batch")
+
+ query = (
+ frappe.qb.from_(sle)
+ .from_(batch)
+ .select(sle.warehouse, sle.batch_no, Sum(sle.actual_qty).as_("qty"))
+ .where(
+ (sle.batch_no == batch.name)
+ & (sle.item_code == item_code)
+ & (sle.company == company)
+ & (batch.disabled == 0)
+ & (sle.is_cancelled == 0)
+ & (IfNull(batch.expiry_date, "2200-01-01") > today())
+ )
+ .groupby(sle.warehouse, sle.batch_no, sle.item_code)
+ .having(Sum(sle.actual_qty) > 0)
+ .orderby(IfNull(batch.expiry_date, "2200-01-01"), batch.creation, sle.batch_no, sle.warehouse)
+ .limit(cint(required_qty + total_picked_qty))
)
- return batch_locations
+ if from_warehouses:
+ query = query.where(sle.warehouse.isin(from_warehouses))
+
+ return query.run(as_dict=True)
def get_available_item_locations_for_serial_and_batched_item(
- item_code, from_warehouses, required_qty, company
+ item_code, from_warehouses, required_qty, company, total_picked_qty=0
):
# Get batch nos by FIFO
locations = get_available_item_locations_for_batched_item(
item_code, from_warehouses, required_qty, company
)
- filters = frappe._dict(
- {"item_code": item_code, "company": company, "warehouse": ["!=", ""], "batch_no": ""}
- )
+ if locations:
+ sn = frappe.qb.DocType("Serial No")
+ conditions = (sn.item_code == item_code) & (sn.company == company)
- # Get Serial Nos by FIFO for Batch No
- for location in locations:
- filters.batch_no = location.batch_no
- filters.warehouse = location.warehouse
- location.qty = (
- required_qty if location.qty > required_qty else location.qty
- ) # if extra qty in batch
+ for location in locations:
+ location.qty = (
+ required_qty if location.qty > required_qty else location.qty
+ ) # if extra qty in batch
- serial_nos = frappe.get_list(
- "Serial No", fields=["name"], filters=filters, limit=location.qty, order_by="purchase_date"
- )
+ serial_nos = (
+ frappe.qb.from_(sn)
+ .select(sn.name)
+ .where(
+ (conditions) & (sn.batch_no == location.batch_no) & (sn.warehouse == location.warehouse)
+ )
+ .orderby(sn.purchase_date)
+ .limit(cint(location.qty + total_picked_qty))
+ ).run(as_dict=True)
- serial_nos = [sn.name for sn in serial_nos]
- location.serial_no = serial_nos
+ serial_nos = [sn.name for sn in serial_nos]
+ location.serial_no = serial_nos
+ location.qty = len(serial_nos)
return locations
-def get_available_item_locations_for_other_item(item_code, from_warehouses, required_qty, company):
- # gets all items available in different warehouses
- warehouses = [x.get("name") for x in frappe.get_list("Warehouse", {"company": company}, "name")]
-
- filters = frappe._dict(
- {"item_code": item_code, "warehouse": ["in", warehouses], "actual_qty": [">", 0]}
+def get_available_item_locations_for_other_item(
+ item_code, from_warehouses, required_qty, company, total_picked_qty=0
+):
+ bin = frappe.qb.DocType("Bin")
+ query = (
+ frappe.qb.from_(bin)
+ .select(bin.warehouse, bin.actual_qty.as_("qty"))
+ .where((bin.item_code == item_code) & (bin.actual_qty > 0))
+ .orderby(bin.creation)
+ .limit(cint(required_qty + total_picked_qty))
)
if from_warehouses:
- filters.warehouse = ["in", from_warehouses]
+ query = query.where(bin.warehouse.isin(from_warehouses))
+ else:
+ wh = frappe.qb.DocType("Warehouse")
+ query = query.from_(wh).where((bin.warehouse == wh.name) & (wh.company == company))
- item_locations = frappe.get_all(
- "Bin",
- fields=["warehouse", "actual_qty as qty"],
- filters=filters,
- limit=required_qty,
- order_by="creation",
- )
+ item_locations = query.run(as_dict=True)
return item_locations
diff --git a/erpnext/stock/doctype/pick_list/pick_list_list.js b/erpnext/stock/doctype/pick_list/pick_list_list.js
new file mode 100644
index 00000000000..ad88b0a682f
--- /dev/null
+++ b/erpnext/stock/doctype/pick_list/pick_list_list.js
@@ -0,0 +1,14 @@
+// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.listview_settings['Pick List'] = {
+ get_indicator: function (doc) {
+ const status_colors = {
+ "Draft": "grey",
+ "Open": "orange",
+ "Completed": "green",
+ "Cancelled": "red",
+ };
+ return [__(doc.status), status_colors[doc.status], "status,=," + doc.status];
+ },
+};
\ No newline at end of file
diff --git a/erpnext/stock/doctype/pick_list/test_pick_list.py b/erpnext/stock/doctype/pick_list/test_pick_list.py
index 43acdf08360..1254fe3927f 100644
--- a/erpnext/stock/doctype/pick_list/test_pick_list.py
+++ b/erpnext/stock/doctype/pick_list/test_pick_list.py
@@ -414,6 +414,7 @@ class TestPickList(FrappeTestCase):
pick_list.submit()
delivery_note = create_delivery_note(pick_list.name)
+ pick_list.load_from_db()
self.assertEqual(pick_list.locations[0].qty, delivery_note.items[0].qty)
self.assertEqual(pick_list.locations[1].qty, delivery_note.items[1].qty)
@@ -663,3 +664,147 @@ class TestPickList(FrappeTestCase):
self.assertEqual(dn.items[0].rate, 42)
so.reload()
self.assertEqual(so.per_delivered, 100)
+
+ def test_pick_list_status(self):
+ warehouse = "_Test Warehouse - _TC"
+ item = make_item(properties={"maintain_stock": 1}).name
+ make_stock_entry(item=item, to_warehouse=warehouse, qty=10)
+
+ so = make_sales_order(item_code=item, qty=10, rate=100)
+
+ pl = create_pick_list(so.name)
+ pl.save()
+ pl.reload()
+ self.assertEqual(pl.status, "Draft")
+
+ pl.submit()
+ pl.reload()
+ self.assertEqual(pl.status, "Open")
+
+ dn = create_delivery_note(pl.name)
+ dn.save()
+ pl.reload()
+ self.assertEqual(pl.status, "Open")
+
+ dn.submit()
+ pl.reload()
+ self.assertEqual(pl.status, "Completed")
+
+ dn.cancel()
+ pl.reload()
+ self.assertEqual(pl.status, "Completed")
+
+ pl.cancel()
+ pl.reload()
+ self.assertEqual(pl.status, "Cancelled")
+
+ def test_consider_existing_pick_list(self):
+ def create_items(items_properties):
+ items = []
+
+ for properties in items_properties:
+ properties.update({"maintain_stock": 1})
+ item_code = make_item(properties=properties).name
+ properties.update({"item_code": item_code})
+ items.append(properties)
+
+ return items
+
+ def create_stock_entries(items):
+ warehouses = ["Stores - _TC", "Finished Goods - _TC"]
+
+ for item in items:
+ for warehouse in warehouses:
+ se = make_stock_entry(
+ item=item.get("item_code"),
+ to_warehouse=warehouse,
+ qty=5,
+ )
+
+ def get_item_list(items, qty, warehouse="All Warehouses - _TC"):
+ return [
+ {
+ "item_code": item.get("item_code"),
+ "qty": qty,
+ "warehouse": warehouse,
+ }
+ for item in items
+ ]
+
+ def get_picked_items_details(pick_list_doc):
+ items_data = {}
+
+ for location in pick_list_doc.locations:
+ key = (location.warehouse, location.batch_no) if location.batch_no else location.warehouse
+ serial_no = [x for x in location.serial_no.split("\n") if x] if location.serial_no else None
+ data = {"picked_qty": location.picked_qty}
+ if serial_no:
+ data["serial_no"] = serial_no
+ if location.item_code not in items_data:
+ items_data[location.item_code] = {key: data}
+ else:
+ items_data[location.item_code][key] = data
+
+ return items_data
+
+ # Step - 1: Setup - Create Items and Stock Entries
+ items_properties = [
+ {
+ "valuation_rate": 100,
+ },
+ {
+ "valuation_rate": 200,
+ "has_batch_no": 1,
+ "create_new_batch": 1,
+ },
+ {
+ "valuation_rate": 300,
+ "has_serial_no": 1,
+ "serial_no_series": "SNO.###",
+ },
+ {
+ "valuation_rate": 400,
+ "has_batch_no": 1,
+ "create_new_batch": 1,
+ "has_serial_no": 1,
+ "serial_no_series": "SNO.###",
+ },
+ ]
+
+ items = create_items(items_properties)
+ create_stock_entries(items)
+
+ # Step - 2: Create Sales Order [1]
+ so1 = make_sales_order(item_list=get_item_list(items, qty=6))
+
+ # Step - 3: Create and Submit Pick List [1] for Sales Order [1]
+ pl1 = create_pick_list(so1.name)
+ pl1.submit()
+
+ # Step - 4: Create Sales Order [2] with same Item(s) as Sales Order [1]
+ so2 = make_sales_order(item_list=get_item_list(items, qty=4))
+
+ # Step - 5: Create Pick List [2] for Sales Order [2]
+ pl2 = create_pick_list(so2.name)
+ pl2.save()
+
+ # Step - 6: Assert
+ picked_items_details = get_picked_items_details(pl1)
+
+ for location in pl2.locations:
+ key = (location.warehouse, location.batch_no) if location.batch_no else location.warehouse
+ item_data = picked_items_details.get(location.item_code, {}).get(key, {})
+ picked_qty = item_data.get("picked_qty", 0)
+ picked_serial_no = picked_items_details.get("serial_no", [])
+ bin_actual_qty = frappe.db.get_value(
+ "Bin", {"item_code": location.item_code, "warehouse": location.warehouse}, "actual_qty"
+ )
+
+ # Available Qty to pick should be equal to [Actual Qty - Picked Qty]
+ self.assertEqual(location.stock_qty, bin_actual_qty - picked_qty)
+
+ # Serial No should not be in the Picked Serial No list
+ if location.serial_no:
+ a = set(picked_serial_no)
+ b = set([x for x in location.serial_no.split("\n") if x])
+ self.assertSetEqual(b, b.difference(a))
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 3739cb8c9dd..af0d1483253 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -888,7 +888,7 @@ def update_billing_percentage(pr_doc, update_modified=True):
# Update Billing % based on pending accepted qty
total_amount, total_billed_amount = 0, 0
for item in pr_doc.items:
- return_data = frappe.db.get_list(
+ return_data = frappe.get_all(
"Purchase Receipt",
fields=["sum(abs(`tabPurchase Receipt Item`.qty)) as qty"],
filters=[
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 9321c2c166b..2a9f091bd09 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -221,7 +221,7 @@ class QualityInspection(Document):
def item_query(doctype, txt, searchfield, start, page_len, filters):
from frappe.desk.reportview import get_match_cond
- from_doctype = cstr(filters.get("doctype"))
+ from_doctype = cstr(filters.get("from"))
if not from_doctype or not frappe.db.exists("DocType", from_doctype):
return []
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 897fca3978a..fb1f77ad3bb 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -169,6 +169,8 @@ frappe.ui.form.on('Stock Entry', {
},
refresh: function(frm) {
+ frm.trigger("get_items_from_transit_entry");
+
if(!frm.doc.docstatus) {
frm.trigger('validate_purpose_consumption');
frm.add_custom_button(__('Material Request'), function() {
@@ -337,6 +339,28 @@ frappe.ui.form.on('Stock Entry', {
}
},
+ get_items_from_transit_entry: function(frm) {
+ if (frm.doc.docstatus===0) {
+ frm.add_custom_button(__('Transit Entry'), function() {
+ erpnext.utils.map_current_doc({
+ method: "erpnext.stock.doctype.stock_entry.stock_entry.make_stock_in_entry",
+ source_doctype: "Stock Entry",
+ target: frm,
+ date_field: "posting_date",
+ setters: {
+ stock_entry_type: "Material Transfer",
+ purpose: "Material Transfer",
+ },
+ get_query_filters: {
+ docstatus: 1,
+ purpose: "Material Transfer",
+ add_to_transit: 1,
+ }
+ })
+ }, __("Get Items From"));
+ }
+ },
+
before_save: function(frm) {
frm.doc.items.forEach((item) => {
item.uom = item.uom || item.stock_uom;
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 1755f28a1d4..8c20ca0211e 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -158,6 +158,7 @@ class StockEntry(StockController):
self.validate_subcontract_order()
self.update_subcontract_order_supplied_items()
self.update_subcontracting_order_status()
+ self.update_pick_list_status()
self.make_gl_entries()
@@ -2276,6 +2277,11 @@ class StockEntry(StockController):
update_subcontracting_order_status(self.subcontracting_order)
+ def update_pick_list_status(self):
+ from erpnext.stock.doctype.pick_list.pick_list import update_pick_list_status
+
+ update_pick_list_status(self.pick_list)
+
def set_missing_values(self):
"Updates rate and availability of all the items of mapped doc."
self.set_transfer_qty()
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
index 41a3b8916de..0f9001392df 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py
@@ -117,6 +117,7 @@ def make_stock_entry(**args):
args.item = "_Test Item"
s.company = args.company or erpnext.get_default_company()
+ s.add_to_transit = args.add_to_transit or 0
s.purchase_receipt_no = args.purchase_receipt_no
s.delivery_note_no = args.delivery_note_no
s.sales_invoice_no = args.sales_invoice_no
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index 4e4fe758b59..cc06bd709ad 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -17,6 +17,7 @@ from erpnext.stock.doctype.item.test_item import (
from erpnext.stock.doctype.serial_no.serial_no import * # noqa
from erpnext.stock.doctype.stock_entry.stock_entry import (
FinishedGoodError,
+ make_stock_in_entry,
move_sample_to_retention_warehouse,
)
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
@@ -160,6 +161,53 @@ class TestStockEntry(FrappeTestCase):
self.assertTrue(item_code in items)
+ def test_add_to_transit_entry(self):
+ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+
+ item_code = "_Test Transit Item"
+ company = "_Test Company"
+
+ create_warehouse("Test From Warehouse")
+ create_warehouse("Test Transit Warehouse")
+ create_warehouse("Test To Warehouse")
+
+ create_item(
+ item_code=item_code,
+ is_stock_item=1,
+ is_purchase_item=1,
+ company=company,
+ )
+
+ # create inward stock entry
+ make_stock_entry(
+ item_code=item_code,
+ target="Test From Warehouse - _TC",
+ qty=10,
+ basic_rate=100,
+ expense_account="Stock Adjustment - _TC",
+ cost_center="Main - _TC",
+ )
+
+ transit_entry = make_stock_entry(
+ item_code=item_code,
+ source="Test From Warehouse - _TC",
+ target="Test Transit Warehouse - _TC",
+ add_to_transit=1,
+ stock_entry_type="Material Transfer",
+ purpose="Material Transfer",
+ qty=10,
+ basic_rate=100,
+ expense_account="Stock Adjustment - _TC",
+ cost_center="Main - _TC",
+ )
+
+ end_transit_entry = make_stock_in_entry(transit_entry.name)
+ self.assertEqual(transit_entry.name, end_transit_entry.outgoing_stock_entry)
+ self.assertEqual(transit_entry.name, end_transit_entry.items[0].against_stock_entry)
+ self.assertEqual(transit_entry.items[0].name, end_transit_entry.items[0].ste_detail)
+
+ # create add to transit
+
def test_material_receipt_gl_entry(self):
company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 363dc0a63f3..5af144110f0 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -236,8 +236,10 @@ def validate_item_details(args, item):
validate_end_of_life(item.name, item.end_of_life, item.disabled)
- if args.transaction_type == "selling" and cint(item.has_variants):
- throw(_("Item {0} is a template, please select one of its variants").format(item.name))
+ if cint(item.has_variants):
+ msg = f"Item {item.name} is a template, please select one of its variants"
+
+ throw(_(msg), title=_("Template Item Selected"))
elif args.transaction_type == "buying" and args.doctype != "Material Request":
if args.get("is_subcontracted"):
diff --git a/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py b/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
index b5c6764224b..abbb33b2f16 100644
--- a/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
+++ b/erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py
@@ -62,7 +62,7 @@ def execute(filters=None):
continue
total_stock_value = sum(item_value[(item, item_group)])
- row = [item, item_group, total_stock_value]
+ row = [item, item_map[item]["item_name"], item_group, total_stock_value]
fifo_queue = item_ageing[item]["fifo_queue"]
average_age = 0.00
@@ -89,10 +89,11 @@ def get_columns(filters):
"""return columns"""
columns = [
- _("Item") + ":Link/Item:180",
- _("Item Group") + "::100",
+ _("Item") + ":Link/Item:150",
+ _("Item Name") + ":Link/Item:150",
+ _("Item Group") + "::120",
_("Value") + ":Currency:120",
- _("Age") + ":Float:80",
+ _("Age") + ":Float:120",
]
return columns
@@ -123,7 +124,7 @@ def get_warehouse_list(filters):
def add_warehouse_column(columns, warehouse_list):
if len(warehouse_list) > 1:
- columns += [_("Total Qty") + ":Int:90"]
+ columns += [_("Total Qty") + ":Int:120"]
for wh in warehouse_list:
- columns += [_(wh.name) + ":Int:120"]
+ columns += [_(wh.name) + ":Int:100"]
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 30e75bff3de..08fc6fbd42f 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -1179,7 +1179,7 @@ def get_stock_ledger_entries(
def get_sle_by_voucher_detail_no(voucher_detail_no, excluded_sle=None):
return frappe.db.get_value(
"Stock Ledger Entry",
- {"voucher_detail_no": voucher_detail_no, "name": ["!=", excluded_sle]},
+ {"voucher_detail_no": voucher_detail_no, "name": ["!=", excluded_sle], "is_cancelled": 0},
[
"item_code",
"warehouse",
diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
index aab2fc927d0..7ca12642c5f 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
+++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js
@@ -11,6 +11,7 @@ frappe.listview_settings['Subcontracting Order'] = {
"Partial Material Transferred": "purple",
"Material Transferred": "blue",
"Closed": "red",
+ "Cancelled": "red",
};
return [__(doc.status), status_colors[doc.status], "status,=," + doc.status];
},
diff --git a/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json b/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json
index 3675a4ea08a..d77e77440e0 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json
+++ b/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json
@@ -1,352 +1,353 @@
{
- "actions": [],
- "autoname": "hash",
- "creation": "2022-04-01 19:26:31.475015",
- "doctype": "DocType",
- "document_type": "Document",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "item_code",
- "item_name",
- "bom",
- "include_exploded_items",
- "column_break_3",
- "schedule_date",
- "expected_delivery_date",
- "description_section",
- "description",
- "column_break_8",
- "image",
- "image_view",
- "quantity_and_rate_section",
- "qty",
- "received_qty",
- "returned_qty",
- "column_break_13",
- "stock_uom",
- "conversion_factor",
- "section_break_16",
- "rate",
- "amount",
- "column_break_19",
- "rm_cost_per_qty",
- "service_cost_per_qty",
- "additional_cost_per_qty",
- "warehouse_section",
- "warehouse",
- "accounting_details_section",
- "expense_account",
- "manufacture_section",
- "manufacturer",
- "manufacturer_part_no",
- "accounting_dimensions_section",
- "cost_center",
- "dimension_col_break",
- "project",
- "section_break_34",
- "page_break"
- ],
- "fields": [
- {
- "bold": 1,
- "columns": 2,
- "fieldname": "item_code",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Item Code",
- "options": "Item",
- "read_only": 1,
- "reqd": 1,
- "search_index": 1
- },
- {
- "fetch_from": "item_code.item_name",
- "fetch_if_empty": 1,
- "fieldname": "item_name",
- "fieldtype": "Data",
- "in_global_search": 1,
- "label": "Item Name",
- "print_hide": 1,
- "reqd": 1
- },
- {
- "fieldname": "column_break_3",
- "fieldtype": "Column Break"
- },
- {
- "bold": 1,
- "columns": 2,
- "fieldname": "schedule_date",
- "fieldtype": "Date",
- "label": "Required By",
- "print_hide": 1,
- "read_only": 1
- },
- {
- "allow_on_submit": 1,
- "bold": 1,
- "fieldname": "expected_delivery_date",
- "fieldtype": "Date",
- "label": "Expected Delivery Date",
- "search_index": 1
- },
- {
- "collapsible": 1,
- "fieldname": "description_section",
- "fieldtype": "Section Break",
- "label": "Description"
- },
- {
- "fetch_from": "item_code.description",
- "fetch_if_empty": 1,
- "fieldname": "description",
- "fieldtype": "Text Editor",
- "label": "Description",
- "print_width": "300px",
- "reqd": 1,
- "width": "300px"
- },
- {
- "fieldname": "column_break_8",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "image",
- "fieldtype": "Attach",
- "hidden": 1,
- "label": "Image"
- },
- {
- "fieldname": "image_view",
- "fieldtype": "Image",
- "label": "Image View",
- "options": "image",
- "print_hide": 1
- },
- {
- "fieldname": "quantity_and_rate_section",
- "fieldtype": "Section Break",
- "label": "Quantity and Rate"
- },
- {
- "bold": 1,
- "columns": 1,
- "default": "1",
- "fieldname": "qty",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Quantity",
- "print_width": "60px",
- "read_only": 1,
- "reqd": 1,
- "width": "60px"
- },
- {
- "fieldname": "column_break_13",
- "fieldtype": "Column Break",
- "print_hide": 1
- },
- {
- "fieldname": "stock_uom",
- "fieldtype": "Link",
- "label": "Stock UOM",
- "options": "UOM",
- "print_width": "100px",
- "read_only": 1,
- "reqd": 1,
- "width": "100px"
- },
- {
- "default": "1",
- "fieldname": "conversion_factor",
- "fieldtype": "Float",
- "hidden": 1,
- "label": "Conversion Factor",
- "read_only": 1
- },
- {
- "fieldname": "section_break_16",
- "fieldtype": "Section Break"
- },
- {
- "bold": 1,
- "columns": 2,
- "fetch_from": "item_code.standard_rate",
- "fetch_if_empty": 1,
- "fieldname": "rate",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Rate",
- "options": "currency",
- "read_only": 1,
- "reqd": 1
- },
- {
- "fieldname": "column_break_19",
- "fieldtype": "Column Break"
- },
- {
- "columns": 2,
- "fieldname": "amount",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Amount",
- "options": "currency",
- "read_only": 1,
- "reqd": 1
- },
- {
- "fieldname": "warehouse_section",
- "fieldtype": "Section Break",
- "label": "Warehouse Details"
- },
- {
- "fieldname": "warehouse",
- "fieldtype": "Link",
- "label": "Warehouse",
- "options": "Warehouse",
- "print_hide": 1,
- "reqd": 1
- },
- {
- "collapsible": 1,
- "fieldname": "accounting_details_section",
- "fieldtype": "Section Break",
- "label": "Accounting Details"
- },
- {
- "fieldname": "expense_account",
- "fieldtype": "Link",
- "label": "Expense Account",
- "options": "Account",
- "print_hide": 1
- },
- {
- "collapsible": 1,
- "fieldname": "manufacture_section",
- "fieldtype": "Section Break",
- "label": "Manufacture"
- },
- {
- "fieldname": "manufacturer",
- "fieldtype": "Link",
- "label": "Manufacturer",
- "options": "Manufacturer"
- },
- {
- "fieldname": "manufacturer_part_no",
- "fieldtype": "Data",
- "label": "Manufacturer Part Number"
- },
- {
- "depends_on": "item_code",
- "fetch_from": "item_code.default_bom",
- "fieldname": "bom",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "BOM",
- "options": "BOM",
- "print_hide": 1,
- "reqd": 1
- },
- {
- "default": "0",
- "fieldname": "include_exploded_items",
- "fieldtype": "Check",
- "label": "Include Exploded Items",
- "print_hide": 1
- },
- {
- "fieldname": "service_cost_per_qty",
- "fieldtype": "Currency",
- "label": "Service Cost Per Qty",
- "read_only": 1,
- "reqd": 1
- },
- {
- "default": "0",
- "fieldname": "additional_cost_per_qty",
- "fieldtype": "Currency",
- "label": "Additional Cost Per Qty",
- "read_only": 1
- },
- {
- "fieldname": "rm_cost_per_qty",
- "fieldtype": "Currency",
- "label": "Raw Material Cost Per Qty",
- "no_copy": 1,
- "read_only": 1
- },
- {
- "allow_on_submit": 1,
- "default": "0",
- "fieldname": "page_break",
- "fieldtype": "Check",
- "label": "Page Break",
- "no_copy": 1,
- "print_hide": 1
- },
- {
- "fieldname": "section_break_34",
- "fieldtype": "Section Break"
- },
- {
- "depends_on": "received_qty",
- "fieldname": "received_qty",
- "fieldtype": "Float",
- "label": "Received Qty",
- "no_copy": 1,
- "print_hide": 1,
- "read_only": 1
- },
- {
- "depends_on": "returned_qty",
- "fieldname": "returned_qty",
- "fieldtype": "Float",
- "label": "Returned Qty",
- "no_copy": 1,
- "print_hide": 1,
- "read_only": 1
- },
- {
- "collapsible": 1,
- "fieldname": "accounting_dimensions_section",
- "fieldtype": "Section Break",
- "label": "Accounting Dimensions"
- },
- {
- "fieldname": "cost_center",
- "fieldtype": "Link",
- "label": "Cost Center",
- "options": "Cost Center"
- },
- {
- "fieldname": "dimension_col_break",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "project",
- "fieldtype": "Link",
- "label": "Project",
- "options": "Project"
- }
- ],
- "idx": 1,
- "index_web_pages_for_search": 1,
- "istable": 1,
- "links": [],
- "modified": "2022-08-15 14:25:45.177703",
- "modified_by": "Administrator",
- "module": "Subcontracting",
- "name": "Subcontracting Order Item",
- "naming_rule": "Random",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "search_fields": "item_name",
- "sort_field": "modified",
- "sort_order": "DESC",
- "states": [],
- "track_changes": 1
+ "actions": [],
+ "autoname": "hash",
+ "creation": "2022-04-01 19:26:31.475015",
+ "doctype": "DocType",
+ "document_type": "Document",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "item_code",
+ "item_name",
+ "bom",
+ "include_exploded_items",
+ "column_break_3",
+ "schedule_date",
+ "expected_delivery_date",
+ "description_section",
+ "description",
+ "column_break_8",
+ "image",
+ "image_view",
+ "quantity_and_rate_section",
+ "qty",
+ "received_qty",
+ "returned_qty",
+ "column_break_13",
+ "stock_uom",
+ "conversion_factor",
+ "section_break_16",
+ "rate",
+ "amount",
+ "column_break_19",
+ "rm_cost_per_qty",
+ "service_cost_per_qty",
+ "additional_cost_per_qty",
+ "warehouse_section",
+ "warehouse",
+ "accounting_details_section",
+ "expense_account",
+ "manufacture_section",
+ "manufacturer",
+ "manufacturer_part_no",
+ "accounting_dimensions_section",
+ "cost_center",
+ "dimension_col_break",
+ "project",
+ "section_break_34",
+ "page_break"
+ ],
+ "fields": [
+ {
+ "bold": 1,
+ "columns": 2,
+ "fieldname": "item_code",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Item Code",
+ "options": "Item",
+ "read_only": 1,
+ "reqd": 1,
+ "search_index": 1
+ },
+ {
+ "fetch_from": "item_code.item_name",
+ "fetch_if_empty": 1,
+ "fieldname": "item_name",
+ "fieldtype": "Data",
+ "in_global_search": 1,
+ "label": "Item Name",
+ "print_hide": 1,
+ "reqd": 1
+ },
+ {
+ "fieldname": "column_break_3",
+ "fieldtype": "Column Break"
+ },
+ {
+ "bold": 1,
+ "columns": 2,
+ "fieldname": "schedule_date",
+ "fieldtype": "Date",
+ "label": "Required By",
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "allow_on_submit": 1,
+ "bold": 1,
+ "fieldname": "expected_delivery_date",
+ "fieldtype": "Date",
+ "label": "Expected Delivery Date",
+ "search_index": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "description_section",
+ "fieldtype": "Section Break",
+ "label": "Description"
+ },
+ {
+ "fetch_from": "item_code.description",
+ "fetch_if_empty": 1,
+ "fieldname": "description",
+ "fieldtype": "Text Editor",
+ "label": "Description",
+ "print_width": "300px",
+ "reqd": 1,
+ "width": "300px"
+ },
+ {
+ "fieldname": "column_break_8",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "image",
+ "fieldtype": "Attach",
+ "hidden": 1,
+ "label": "Image"
+ },
+ {
+ "fieldname": "image_view",
+ "fieldtype": "Image",
+ "label": "Image View",
+ "options": "image",
+ "print_hide": 1
+ },
+ {
+ "fieldname": "quantity_and_rate_section",
+ "fieldtype": "Section Break",
+ "label": "Quantity and Rate"
+ },
+ {
+ "bold": 1,
+ "columns": 1,
+ "default": "1",
+ "fieldname": "qty",
+ "fieldtype": "Float",
+ "in_list_view": 1,
+ "label": "Quantity",
+ "print_width": "60px",
+ "read_only": 1,
+ "reqd": 1,
+ "width": "60px"
+ },
+ {
+ "fieldname": "column_break_13",
+ "fieldtype": "Column Break",
+ "print_hide": 1
+ },
+ {
+ "fieldname": "stock_uom",
+ "fieldtype": "Link",
+ "label": "Stock UOM",
+ "options": "UOM",
+ "print_width": "100px",
+ "read_only": 1,
+ "reqd": 1,
+ "width": "100px"
+ },
+ {
+ "default": "1",
+ "fieldname": "conversion_factor",
+ "fieldtype": "Float",
+ "hidden": 1,
+ "label": "Conversion Factor",
+ "read_only": 1
+ },
+ {
+ "fieldname": "section_break_16",
+ "fieldtype": "Section Break"
+ },
+ {
+ "bold": 1,
+ "columns": 2,
+ "fetch_from": "item_code.standard_rate",
+ "fetch_if_empty": 1,
+ "fieldname": "rate",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Rate",
+ "options": "currency",
+ "read_only": 1,
+ "reqd": 1
+ },
+ {
+ "fieldname": "column_break_19",
+ "fieldtype": "Column Break"
+ },
+ {
+ "columns": 2,
+ "fieldname": "amount",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Amount",
+ "options": "currency",
+ "read_only": 1,
+ "reqd": 1
+ },
+ {
+ "fieldname": "warehouse_section",
+ "fieldtype": "Section Break",
+ "label": "Warehouse Details"
+ },
+ {
+ "fieldname": "warehouse",
+ "fieldtype": "Link",
+ "label": "Warehouse",
+ "options": "Warehouse",
+ "print_hide": 1,
+ "reqd": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "accounting_details_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Details"
+ },
+ {
+ "fieldname": "expense_account",
+ "fieldtype": "Link",
+ "label": "Expense Account",
+ "options": "Account",
+ "print_hide": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "manufacture_section",
+ "fieldtype": "Section Break",
+ "label": "Manufacture"
+ },
+ {
+ "fieldname": "manufacturer",
+ "fieldtype": "Link",
+ "label": "Manufacturer",
+ "options": "Manufacturer"
+ },
+ {
+ "fieldname": "manufacturer_part_no",
+ "fieldtype": "Data",
+ "label": "Manufacturer Part Number"
+ },
+ {
+ "depends_on": "item_code",
+ "fetch_from": "item_code.default_bom",
+ "fetch_if_empty": 1,
+ "fieldname": "bom",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "BOM",
+ "options": "BOM",
+ "print_hide": 1,
+ "reqd": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "include_exploded_items",
+ "fieldtype": "Check",
+ "label": "Include Exploded Items",
+ "print_hide": 1
+ },
+ {
+ "fieldname": "service_cost_per_qty",
+ "fieldtype": "Currency",
+ "label": "Service Cost Per Qty",
+ "read_only": 1,
+ "reqd": 1
+ },
+ {
+ "default": "0",
+ "fieldname": "additional_cost_per_qty",
+ "fieldtype": "Currency",
+ "label": "Additional Cost Per Qty",
+ "read_only": 1
+ },
+ {
+ "fieldname": "rm_cost_per_qty",
+ "fieldtype": "Currency",
+ "label": "Raw Material Cost Per Qty",
+ "no_copy": 1,
+ "read_only": 1
+ },
+ {
+ "allow_on_submit": 1,
+ "default": "0",
+ "fieldname": "page_break",
+ "fieldtype": "Check",
+ "label": "Page Break",
+ "no_copy": 1,
+ "print_hide": 1
+ },
+ {
+ "fieldname": "section_break_34",
+ "fieldtype": "Section Break"
+ },
+ {
+ "depends_on": "received_qty",
+ "fieldname": "received_qty",
+ "fieldtype": "Float",
+ "label": "Received Qty",
+ "no_copy": 1,
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "depends_on": "returned_qty",
+ "fieldname": "returned_qty",
+ "fieldtype": "Float",
+ "label": "Returned Qty",
+ "no_copy": 1,
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "collapsible": 1,
+ "fieldname": "accounting_dimensions_section",
+ "fieldtype": "Section Break",
+ "label": "Accounting Dimensions"
+ },
+ {
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "label": "Cost Center",
+ "options": "Cost Center"
+ },
+ {
+ "fieldname": "dimension_col_break",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "project",
+ "fieldtype": "Link",
+ "label": "Project",
+ "options": "Project"
+ }
+ ],
+ "idx": 1,
+ "index_web_pages_for_search": 1,
+ "istable": 1,
+ "links": [],
+ "modified": "2023-01-20 23:25:45.363281",
+ "modified_by": "Administrator",
+ "module": "Subcontracting",
+ "name": "Subcontracting Order Item",
+ "naming_rule": "Random",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "search_fields": "item_name",
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "states": [],
+ "track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
index e8faa4868f2..f4fd4de169d 100644
--- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
+++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
@@ -262,15 +262,17 @@ class SubcontractingReceipt(SubcontractingController):
def get_gl_entries(self, warehouse_account=None):
from erpnext.accounts.general_ledger import process_gl_map
+ if not erpnext.is_perpetual_inventory_enabled(self.company):
+ return []
+
gl_entries = []
self.make_item_gl_entries(gl_entries, warehouse_account)
return process_gl_map(gl_entries)
def make_item_gl_entries(self, gl_entries, warehouse_account=None):
- if erpnext.is_perpetual_inventory_enabled(self.company):
- stock_rbnb = self.get_company_default("stock_received_but_not_billed")
- expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
+ stock_rbnb = self.get_company_default("stock_received_but_not_billed")
+ expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
warehouse_with_no_account = []
diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py
index e1e12bd60d8..185ec6615f6 100644
--- a/erpnext/templates/pages/order.py
+++ b/erpnext/templates/pages/order.py
@@ -38,22 +38,27 @@ def get_context(context):
if not frappe.has_website_permission(context.doc):
frappe.throw(_("Not Permitted"), frappe.PermissionError)
- # check for the loyalty program of the customer
- customer_loyalty_program = frappe.db.get_value(
- "Customer", context.doc.customer, "loyalty_program"
- )
- if customer_loyalty_program:
- from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
- get_loyalty_program_details_with_points,
+ context.available_loyalty_points = 0.0
+ if context.doc.get("customer"):
+ # check for the loyalty program of the customer
+ customer_loyalty_program = frappe.db.get_value(
+ "Customer", context.doc.customer, "loyalty_program"
)
- loyalty_program_details = get_loyalty_program_details_with_points(
- context.doc.customer, customer_loyalty_program
- )
- context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points"))
+ if customer_loyalty_program:
+ from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
+ get_loyalty_program_details_with_points,
+ )
- # show Make Purchase Invoice button based on permission
- context.show_make_pi_button = frappe.has_permission("Purchase Invoice", "create")
+ loyalty_program_details = get_loyalty_program_details_with_points(
+ context.doc.customer, customer_loyalty_program
+ )
+ context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points"))
+
+ context.show_make_pi_button = False
+ if context.doc.get("supplier"):
+ # show Make Purchase Invoice button based on permission
+ context.show_make_pi_button = frappe.has_permission("Purchase Invoice", "create")
def get_attachments(dt, dn):
diff --git a/erpnext/translations/af.csv b/erpnext/translations/af.csv
index 45435d86008..265e85c0f1d 100644
--- a/erpnext/translations/af.csv
+++ b/erpnext/translations/af.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kwaliteit-terugvoersjabloon,
Rules for applying different promotional schemes.,Reëls vir die toepassing van verskillende promosieskemas.,
Shift,verskuiwing,
Show {0},Wys {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Spesiale karakters behalwe "-", "#", ".", "/", "{" En "}" word nie toegelaat in die naamreekse nie",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Spesiale karakters behalwe "-", "#", ".", "/", "{{" En "}}" word nie toegelaat in die naamreekse nie {0}",
Target Details,Teikenbesonderhede,
{0} already has a Parent Procedure {1}.,{0} het reeds 'n ouerprosedure {1}.,
API,API,
diff --git a/erpnext/translations/am.csv b/erpnext/translations/am.csv
index 554b0a54f1c..d1314048213 100644
--- a/erpnext/translations/am.csv
+++ b/erpnext/translations/am.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,የጥራት ግብረ መልስ አብነት።,
Rules for applying different promotional schemes.,የተለያዩ የማስተዋወቂያ ዘዴዎችን ለመተግበር ህጎች።,
Shift,ቀይር,
Show {0},አሳይ {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",ከ "-" ፣ "#" ፣ "፣" ፣ "/" ፣ "{" እና "}" በስተቀር ልዩ ቁምፊዎች ከመለያ መሰየሚያ አይፈቀድም,
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",ከ "-" ፣ "#" ፣ "፣" ፣ "/" ፣ "{{" እና "}}" በስተቀር ልዩ ቁምፊዎች ከመለያ መሰየሚያ አይፈቀድም {0},
Target Details,የ Detailsላማ ዝርዝሮች።,
{0} already has a Parent Procedure {1}.,{0} ቀድሞውኑ የወላጅ አሰራር ሂደት አለው {1}።,
API,ኤ ፒ አይ,
diff --git a/erpnext/translations/ar.csv b/erpnext/translations/ar.csv
index e62f61a4f55..c0da1c4d76e 100644
--- a/erpnext/translations/ar.csv
+++ b/erpnext/translations/ar.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,قالب ملاحظات الجودة,
Rules for applying different promotional schemes.,قواعد تطبيق المخططات الترويجية المختلفة.,
Shift,تحول,
Show {0},عرض {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",الأحرف الخاصة باستثناء "-" ، "#" ، "." ، "/" ، "{" و "}" غير مسموح في سلسلة التسمية,
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} الأحرف الخاصة باستثناء "-" ، "#" ، "." ، "/" ، "{{" و "}}" غير مسموح في سلسلة التسمية,
Target Details,تفاصيل الهدف,
{0} already has a Parent Procedure {1}.,{0} يحتوي بالفعل على إجراء الأصل {1}.,
API,API,
diff --git a/erpnext/translations/bg.csv b/erpnext/translations/bg.csv
index 15278a6a40c..ac6dc7851b2 100644
--- a/erpnext/translations/bg.csv
+++ b/erpnext/translations/bg.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Качествен обратен шаблон,
Rules for applying different promotional schemes.,Правила за прилагане на различни промоционални схеми.,
Shift,изместване,
Show {0},Показване на {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Специални символи, с изключение на "-", "#", ".", "/", "{" И "}" не са позволени в именуването на серии",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Специални символи, с изключение на "-", "#", ".", "/", "{{" И "}}" не са позволени в именуването на серии {0}",
Target Details,Детайли за целта,
{0} already has a Parent Procedure {1}.,{0} вече има родителска процедура {1}.,
API,API,
diff --git a/erpnext/translations/bn.csv b/erpnext/translations/bn.csv
index cf0971667b0..52f7b1c593a 100644
--- a/erpnext/translations/bn.csv
+++ b/erpnext/translations/bn.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,গুণমান প্রতিক্রিয়
Rules for applying different promotional schemes.,বিভিন্ন প্রচারমূলক স্কিম প্রয়োগ করার নিয়ম।,
Shift,পরিবর্তন,
Show {0},{0} দেখান,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","নামকরণ সিরিজে "-", "#", "।", "/", "{" এবং "}" ব্যতীত বিশেষ অক্ষর অনুমোদিত নয়",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","নামকরণ সিরিজে "-", "#", "।", "/", "{{" এবং "}}" ব্যতীত বিশেষ অক্ষর অনুমোদিত নয় {0}",
Target Details,টার্গেটের বিশদ,
{0} already has a Parent Procedure {1}.,{0} ইতিমধ্যে একটি মূল পদ্ধতি আছে {1}।,
API,এপিআই,
diff --git a/erpnext/translations/bs.csv b/erpnext/translations/bs.csv
index 6ef445a1af0..267434f480a 100644
--- a/erpnext/translations/bs.csv
+++ b/erpnext/translations/bs.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Predložak kvalitetne povratne informacije,
Rules for applying different promotional schemes.,Pravila za primjenu različitih promotivnih shema.,
Shift,Shift,
Show {0},Prikaži {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Posebni znakovi osim "-", "#", ".", "/", "{" I "}" nisu dozvoljeni u imenovanju serija",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Posebni znakovi osim "-", "#", ".", "/", "{{" I "}}" nisu dozvoljeni u imenovanju serija {0}",
Target Details,Detalji cilja,
{0} already has a Parent Procedure {1}.,{0} već ima roditeljsku proceduru {1}.,
API,API,
diff --git a/erpnext/translations/ca.csv b/erpnext/translations/ca.csv
index 18fa52a2b79..d8c2ef68e6e 100644
--- a/erpnext/translations/ca.csv
+++ b/erpnext/translations/ca.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Plantilla de comentaris de qualitat,
Rules for applying different promotional schemes.,Normes per aplicar diferents règims promocionals.,
Shift,Majúscules,
Show {0},Mostra {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caràcters especials, excepte "-", "#", ".", "/", "{" I "}" no estan permesos en nomenar sèries",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caràcters especials, excepte "-", "#", ".", "/", "{{" I "}}" no estan permesos en nomenar sèries {0}",
Target Details,Detalls de l'objectiu,
{0} already has a Parent Procedure {1}.,{0} ja té un procediment progenitor {1}.,
API,API,
diff --git a/erpnext/translations/cs.csv b/erpnext/translations/cs.csv
index 705e471d278..7d570bbdd04 100644
--- a/erpnext/translations/cs.csv
+++ b/erpnext/translations/cs.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Šablona zpětné vazby kvality,
Rules for applying different promotional schemes.,Pravidla pro uplatňování různých propagačních programů.,
Shift,Posun,
Show {0},Zobrazit {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Zvláštní znaky kromě "-", "#", ".", "/", "{" A "}" nejsou v názvových řadách povoleny",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Zvláštní znaky kromě "-", "#", ".", "/", "{{" A "}}" nejsou v názvových řadách povoleny {0}",
Target Details,Podrobnosti o cíli,
{0} already has a Parent Procedure {1}.,{0} již má rodičovský postup {1}.,
API,API,
diff --git a/erpnext/translations/da.csv b/erpnext/translations/da.csv
index c0d01466943..16b2e878e04 100644
--- a/erpnext/translations/da.csv
+++ b/erpnext/translations/da.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitetsfeedback-skabelon,
Rules for applying different promotional schemes.,Regler for anvendelse af forskellige salgsfremmende ordninger.,
Shift,Flytte,
Show {0},Vis {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Specialtegn undtagen "-", "#", ".", "/", "{" Og "}" er ikke tilladt i navngivningsserier",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Specialtegn undtagen "-", "#", ".", "/", "{{" Og "}}" er ikke tilladt i navngivningsserier {0}",
Target Details,Måldetaljer,
{0} already has a Parent Procedure {1}.,{0} har allerede en overordnet procedure {1}.,
API,API,
diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv
index 1014e27d6cf..5a0a863a47e 100644
--- a/erpnext/translations/de.csv
+++ b/erpnext/translations/de.csv
@@ -3546,7 +3546,7 @@ Quality Feedback Template,Qualitäts-Feedback-Vorlage,
Rules for applying different promotional schemes.,Regeln für die Anwendung verschiedener Werbemaßnahmen.,
Shift,Verschiebung,
Show {0},{0} anzeigen,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Sonderzeichen außer "-", "#", ".", "/", "{" Und "}" sind bei der Benennung von Serien nicht zulässig",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Sonderzeichen außer "-", "#", ".", "/", "{{" Und "}}" sind bei der Benennung von Serien nicht zulässig {0}",
Target Details,Zieldetails,
{0} already has a Parent Procedure {1}.,{0} hat bereits eine übergeordnete Prozedur {1}.,
API,API,
diff --git a/erpnext/translations/el.csv b/erpnext/translations/el.csv
index acf5db5d467..06b80603e63 100644
--- a/erpnext/translations/el.csv
+++ b/erpnext/translations/el.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Πρότυπο σχολιασμού ποιότητας
Rules for applying different promotional schemes.,Κανόνες εφαρμογής διαφορετικών προγραμμάτων προώθησης.,
Shift,Βάρδια,
Show {0},Εμφάνιση {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Ειδικοί χαρακτήρες εκτός από "-", "#", ".", "/", "" Και "}" δεν επιτρέπονται στη σειρά ονομασίας",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Ειδικοί χαρακτήρες εκτός από "-", "#", ".", "/", "{" Και "}}" δεν επιτρέπονται στη σειρά ονομασίας {0}",
Target Details,Στοιχεία στόχου,
{0} already has a Parent Procedure {1}.,{0} έχει ήδη μια διαδικασία γονέα {1}.,
API,API,
diff --git a/erpnext/translations/es.csv b/erpnext/translations/es.csv
index 0f2259db21e..b216b868bbd 100644
--- a/erpnext/translations/es.csv
+++ b/erpnext/translations/es.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Plantilla de comentarios de calidad,
Rules for applying different promotional schemes.,Reglas para aplicar diferentes esquemas promocionales.,
Shift,Cambio,
Show {0},Mostrar {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caracteres especiales excepto "-", "#", ".", "/", "{" Y "}" no están permitidos en las series de nombres",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caracteres especiales excepto "-", "#", ".", "/", "{{" Y "}}" no están permitidos en las series de nombres {0}",
Target Details,Detalles del objetivo,
{0} already has a Parent Procedure {1}.,{0} ya tiene un Procedimiento principal {1}.,
API,API,
diff --git a/erpnext/translations/et.csv b/erpnext/translations/et.csv
index ba32187c680..5d67d81b794 100644
--- a/erpnext/translations/et.csv
+++ b/erpnext/translations/et.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvaliteetse tagasiside mall,
Rules for applying different promotional schemes.,Erinevate reklaamiskeemide rakenduseeskirjad.,
Shift,Vahetus,
Show {0},Kuva {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Erimärgid, välja arvatud "-", "#", ".", "/", "{" Ja "}" pole sarjade nimetamisel lubatud",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Erimärgid, välja arvatud "-", "#", ".", "/", "{{" Ja "}}" pole sarjade nimetamisel lubatud {0}",
Target Details,Sihtkoha üksikasjad,
{0} already has a Parent Procedure {1}.,{0} juba on vanemamenetlus {1}.,
API,API,
diff --git a/erpnext/translations/fa.csv b/erpnext/translations/fa.csv
index 4a7c979499e..040034d09ec 100644
--- a/erpnext/translations/fa.csv
+++ b/erpnext/translations/fa.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,الگوی بازخورد کیفیت,
Rules for applying different promotional schemes.,قوانین استفاده از طرح های تبلیغاتی مختلف.,
Shift,تغییر مکان,
Show {0},نمایش {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",کاراکترهای خاص به جز "-" ، "#" ، "." ، "/" ، "{" و "}" در سریال نامگذاری مجاز نیستند,
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} کاراکترهای خاص به جز "-" ، "#" ، "." ، "/" ، "{{" و "}}" در سریال نامگذاری مجاز نیستند,
Target Details,جزئیات هدف,
{0} already has a Parent Procedure {1}.,{0} در حال حاضر یک روش والدین {1} دارد.,
API,API,
diff --git a/erpnext/translations/fi.csv b/erpnext/translations/fi.csv
index 29eb56702d7..27ea3b8dd45 100644
--- a/erpnext/translations/fi.csv
+++ b/erpnext/translations/fi.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Laadun palautteen malli,
Rules for applying different promotional schemes.,Säännöt erilaisten myynninedistämisjärjestelmien soveltamisesta.,
Shift,Siirtää,
Show {0},Näytä {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Erikoismerkit paitsi "-", "#", ".", "/", "{" Ja "}" eivät ole sallittuja nimeämissarjoissa",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Erikoismerkit paitsi "-", "#", ".", "/", "{{" Ja "}}" eivät ole sallittuja nimeämissarjoissa {0}",
Target Details,Kohteen yksityiskohdat,
{0} already has a Parent Procedure {1}.,{0}: llä on jo vanhempainmenettely {1}.,
API,API,
diff --git a/erpnext/translations/fr.csv b/erpnext/translations/fr.csv
index 3ba5ade6299..8367afd3312 100644
--- a/erpnext/translations/fr.csv
+++ b/erpnext/translations/fr.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Modèle de commentaires sur la qualité,
Rules for applying different promotional schemes.,Règles d'application de différents programmes promotionnels.,
Shift,Décalage,
Show {0},Montrer {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caractères spéciaux sauf "-", "#", ".", "/", "{" Et "}" non autorisés dans les séries de nommage",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caractères spéciaux sauf "-", "#", ".", "/", "{{" Et "}}" non autorisés dans les séries de nommage {0}",
Target Details,Détails de la cible,
{0} already has a Parent Procedure {1}.,{0} a déjà une procédure parent {1}.,
API,API,
diff --git a/erpnext/translations/gu.csv b/erpnext/translations/gu.csv
index 5c2b520d9ec..97adac94db1 100644
--- a/erpnext/translations/gu.csv
+++ b/erpnext/translations/gu.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,ગુણવત્તા પ્રતિસાદ Temp
Rules for applying different promotional schemes.,વિવિધ પ્રમોશનલ યોજનાઓ લાગુ કરવાના નિયમો.,
Shift,પાળી,
Show {0},બતાવો {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" અને "}" સિવાયના વિશેષ અક્ષરો નામકરણ શ્રેણીમાં મંજૂરી નથી",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" અને "}}" સિવાયના વિશેષ અક્ષરો નામકરણ શ્રેણીમાં મંજૂરી નથી {0}",
Target Details,લક્ષ્યાંક વિગતો,
{0} already has a Parent Procedure {1}.,{0} પાસે પહેલેથી જ પિતૃ કાર્યવાહી છે {1}.,
API,API,
diff --git a/erpnext/translations/he.csv b/erpnext/translations/he.csv
index 29e6f6afc32..22b252261fd 100644
--- a/erpnext/translations/he.csv
+++ b/erpnext/translations/he.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,תבנית משוב איכותית,
Rules for applying different promotional schemes.,כללים ליישום תוכניות קידום מכירות שונות.,
Shift,מִשׁמֶרֶת,
Show {0},הצג את {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","תווים מיוחדים למעט "-", "#", ".", "/", "{" ו- "}" אינם מורשים בסדרות שמות",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","{0} תווים מיוחדים למעט "-", "#", ".", "/", "{{" ו- "}}" אינם מורשים בסדרות שמות",
Target Details,פרטי יעד,
{0} already has a Parent Procedure {1}.,{0} כבר יש נוהל הורים {1}.,
API,ממשק API,
diff --git a/erpnext/translations/hi.csv b/erpnext/translations/hi.csv
index c385fc6ef60..ca41cf3d9f4 100644
--- a/erpnext/translations/hi.csv
+++ b/erpnext/translations/hi.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,गुणवत्ता प्रतिक्रि
Rules for applying different promotional schemes.,विभिन्न प्रचार योजनाओं को लागू करने के लिए नियम।,
Shift,खिसक जाना,
Show {0},{0} दिखाएं,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", "।", "/", "{" और "}" को छोड़कर विशेष वर्ण श्रृंखला में अनुमति नहीं है",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", "।", "/", "{{" और "}}" को छोड़कर विशेष वर्ण श्रृंखला {0} में अनुमति नहीं है",
Target Details,लक्ष्य विवरण,
{0} already has a Parent Procedure {1}.,{0} पहले से ही एक पेरेंट प्रोसीजर {1} है।,
API,एपीआई,
diff --git a/erpnext/translations/hr.csv b/erpnext/translations/hr.csv
index a544e98868b..319b80b7c47 100644
--- a/erpnext/translations/hr.csv
+++ b/erpnext/translations/hr.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Predložak povratne informacije o kvaliteti,
Rules for applying different promotional schemes.,Pravila za primjenu različitih promotivnih shema.,
Shift,smjena,
Show {0},Prikaži {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Posebni znakovi osim "-", "#", ".", "/", "{" I "}" nisu dopušteni u imenovanju serija",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Posebni znakovi osim "-", "#", ".", "/", "{{" I "}}" nisu dopušteni u imenovanju serija {0}",
Target Details,Pojedinosti cilja,
{0} already has a Parent Procedure {1}.,{0} već ima roditeljski postupak {1}.,
API,API,
diff --git a/erpnext/translations/hu.csv b/erpnext/translations/hu.csv
index 29f347ecbc6..06647281cd6 100644
--- a/erpnext/translations/hu.csv
+++ b/erpnext/translations/hu.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Minőségi visszajelző sablon,
Rules for applying different promotional schemes.,Különböző promóciós rendszerek alkalmazásának szabályai.,
Shift,Váltás,
Show {0},Mutasd {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Speciális karakterek, kivéve "-", "#", ".", "/", "{" És "}", a sorozatok elnevezése nem megengedett",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Speciális karakterek, kivéve "-", "#", ".", "/", "{{" És "}}", a sorozatok elnevezése nem megengedett {0}",
Target Details,Cél részletei,
{0} already has a Parent Procedure {1}.,A (z) {0} már rendelkezik szülői eljárással {1}.,
API,API,
diff --git a/erpnext/translations/id.csv b/erpnext/translations/id.csv
index 7175ad2fa74..1e507470239 100644
--- a/erpnext/translations/id.csv
+++ b/erpnext/translations/id.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Template Umpan Balik Kualitas,
Rules for applying different promotional schemes.,Aturan untuk menerapkan berbagai skema promosi.,
Shift,Bergeser,
Show {0},Tampilkan {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Karakter Khusus kecuali "-", "#", ".", "/", "{" Dan "}" tidak diizinkan dalam rangkaian penamaan",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Karakter Khusus kecuali "-", "#", ".", "/", "{{" Dan "}}" tidak diizinkan dalam rangkaian penamaan {0}",
Target Details,Detail Target,
{0} already has a Parent Procedure {1}.,{0} sudah memiliki Prosedur Induk {1}.,
API,API,
diff --git a/erpnext/translations/is.csv b/erpnext/translations/is.csv
index 5f56aff3dc7..c20c21eef89 100644
--- a/erpnext/translations/is.csv
+++ b/erpnext/translations/is.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Sniðmát fyrir gæði gæða,
Rules for applying different promotional schemes.,Reglur um beitingu mismunandi kynningarkerfa.,
Shift,Vakt,
Show {0},Sýna {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Sérstafir nema "-", "#", ".", "/", "{" Og "}" ekki leyfðar í nafngiftiröð",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Sérstafir nema "-", "#", ".", "/", "{{" Og "}}" ekki leyfðar í nafngiftiröð {0}",
Target Details,Upplýsingar um markmið,
{0} already has a Parent Procedure {1}.,{0} er þegar með foreldraferli {1}.,
API,API,
diff --git a/erpnext/translations/it.csv b/erpnext/translations/it.csv
index 3a1d73f3447..3d15d5594de 100644
--- a/erpnext/translations/it.csv
+++ b/erpnext/translations/it.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Modello di feedback sulla qualità,
Rules for applying different promotional schemes.,Regole per l'applicazione di diversi schemi promozionali.,
Shift,Cambio,
Show {0},Mostra {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caratteri speciali tranne "-", "#", ".", "/", "{" E "}" non consentiti nelle serie di nomi",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caratteri speciali tranne "-", "#", ".", "/", "{{" E "}}" non consentiti nelle serie di nomi {0}",
Target Details,Dettagli target,
{0} already has a Parent Procedure {1}.,{0} ha già una procedura padre {1}.,
API,API,
diff --git a/erpnext/translations/ja.csv b/erpnext/translations/ja.csv
index 6e2eaae4a44..a11a9a126a9 100644
--- a/erpnext/translations/ja.csv
+++ b/erpnext/translations/ja.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,品質フィードバックテンプレート,
Rules for applying different promotional schemes.,さまざまなプロモーションスキームを適用するための規則。,
Shift,シフト,
Show {0},{0}を表示,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series"," - "、 "#"、 "。"、 "/"、 "{"、および "}"以外の特殊文字は、一連の名前付けでは使用できません,
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}"," - "、 "#"、 "。"、 "/"、 "{{"、および "}}"以外の特殊文字は、一連の名前付けでは使用できません {0},
Target Details,ターゲット詳細,
{0} already has a Parent Procedure {1}.,{0}にはすでに親プロシージャー{1}があります。,
API,API,
diff --git a/erpnext/translations/km.csv b/erpnext/translations/km.csv
index e2a528cea2a..bd70595a7b6 100644
--- a/erpnext/translations/km.csv
+++ b/erpnext/translations/km.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,គំរូមតិយោបល់គុណភាព
Rules for applying different promotional schemes.,វិធានសម្រាប់អនុវត្តគម្រោងផ្សព្វផ្សាយផ្សេងៗគ្នា។,
Shift,ប្តូរ។,
Show {0},បង្ហាញ {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","តួអក្សរពិសេសលើកលែងតែ "-", "#", "។ ", "/", "{" និង "}" មិនត្រូវបានអនុញ្ញាតក្នុងស៊េរីដាក់ឈ្មោះ",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","តួអក្សរពិសេសលើកលែងតែ "-", "#", "។ ", "/", "{{" និង "}}" មិនត្រូវបានអនុញ្ញាតក្នុងស៊េរីដាក់ឈ្មោះ {0}",
Target Details,ព័ត៌មានលម្អិតគោលដៅ។,
{0} already has a Parent Procedure {1}.,{0} មាននីតិវិធីឪពុកម្តាយរួចហើយ {1} ។,
API,API,
diff --git a/erpnext/translations/kn.csv b/erpnext/translations/kn.csv
index 4a9173d4a03..7572a09a086 100644
--- a/erpnext/translations/kn.csv
+++ b/erpnext/translations/kn.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,ಗುಣಮಟ್ಟದ ಪ್ರತಿಕ್ರಿ
Rules for applying different promotional schemes.,ವಿಭಿನ್ನ ಪ್ರಚಾರ ಯೋಜನೆಗಳನ್ನು ಅನ್ವಯಿಸುವ ನಿಯಮಗಳು.,
Shift,ಶಿಫ್ಟ್,
Show {0},{0} ತೋರಿಸು,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" ಮತ್ತು "}" ಹೊರತುಪಡಿಸಿ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಹೆಸರಿಸುವ ಸರಣಿಯಲ್ಲಿ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" ಮತ್ತು "}}" ಹೊರತುಪಡಿಸಿ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಹೆಸರಿಸುವ ಸರಣಿಯಲ್ಲಿ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ {0}",
Target Details,ಗುರಿ ವಿವರಗಳು,
{0} already has a Parent Procedure {1}.,{0} ಈಗಾಗಲೇ ಪೋಷಕ ವಿಧಾನವನ್ನು ಹೊಂದಿದೆ {1}.,
API,API,
diff --git a/erpnext/translations/ko.csv b/erpnext/translations/ko.csv
index c051b07bea5..b873b73b9cd 100644
--- a/erpnext/translations/ko.csv
+++ b/erpnext/translations/ko.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,품질 피드백 템플릿,
Rules for applying different promotional schemes.,다양한 홍보 계획을 적용하기위한 규칙.,
Shift,시프트,
Show {0},{0} 표시,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","이름 계열에 허용되지 않는 "-", "#", ".", "/", "{"및 "}"을 제외한 특수 문자",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","이름 계열에 허용되지 않는 "-", "#", ".", "/", "{{"및 "}}"을 제외한 특수 문자 {0}",
Target Details,대상 세부 정보,
{0} already has a Parent Procedure {1}.,{0}에 이미 상위 절차 {1}이 있습니다.,
API,API,
diff --git a/erpnext/translations/ku.csv b/erpnext/translations/ku.csv
index 6962ea1ef13..89e12c070b5 100644
--- a/erpnext/translations/ku.csv
+++ b/erpnext/translations/ku.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Feedablonê nerazîbûna kalîteyê,
Rules for applying different promotional schemes.,Qanûnên ji bo bicihanîna nexşeyên cûda yên danasînê,
Shift,Tarloqî,
Show {0},Show {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Di tîpa navnasî de ji bilî "-", "#", ".", "/", "{" Û "}" tîpên Taybet",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Di tîpa navnasî de ji bilî "-", "#", ".", "/", "{{" Û "}}" tîpên Taybet {0}",
Target Details,Hûrgulên armancê,
{0} already has a Parent Procedure {1}.,{0} ji berê ve heye Parent Procedure {1}.,
API,API,
diff --git a/erpnext/translations/lo.csv b/erpnext/translations/lo.csv
index b61476cf17b..778a59b3c2e 100644
--- a/erpnext/translations/lo.csv
+++ b/erpnext/translations/lo.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,ແມ່ແບບ ຄຳ ຕິຊົມຄຸນນ
Rules for applying different promotional schemes.,ກົດລະບຽບໃນການ ນຳ ໃຊ້ແຜນການໂຄສະນາທີ່ແຕກຕ່າງກັນ.,
Shift,ປ່ຽນ,
Show {0},ສະແດງ {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","ຕົວລະຄອນພິເສດຍົກເວັ້ນ "-", "#", ".", "/", "{" ແລະ "}" ບໍ່ໄດ້ຖືກອະນຸຍາດໃນຊຸດຊື່",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","ຕົວລະຄອນພິເສດຍົກເວັ້ນ "-", "#", ".", "/", "{{" ແລະ "}}" ບໍ່ໄດ້ຖືກອະນຸຍາດໃນຊຸດຊື່ {0}",
Target Details,ລາຍລະອຽດເປົ້າ ໝາຍ,
{0} already has a Parent Procedure {1}.,{0} ມີຂັ້ນຕອນການເປັນພໍ່ແມ່ {1} ແລ້ວ.,
API,API,
diff --git a/erpnext/translations/lt.csv b/erpnext/translations/lt.csv
index 78571f96243..4721ce43ff3 100644
--- a/erpnext/translations/lt.csv
+++ b/erpnext/translations/lt.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kokybės atsiliepimų šablonas,
Rules for applying different promotional schemes.,Skirtingų reklamos schemų taikymo taisyklės.,
Shift,Pamaina,
Show {0},Rodyti {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Specialieji simboliai, išskyrus „-“, „#“, „.“, „/“, „{“ Ir „}“, neleidžiami įvardyti serijomis",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Specialieji simboliai, išskyrus "-", "#", "।", "/", "{{" Ir "}}", neleidžiami įvardyti serijomis {0}",
Target Details,Tikslinė informacija,
{0} already has a Parent Procedure {1}.,{0} jau turi tėvų procedūrą {1}.,
API,API,
diff --git a/erpnext/translations/lv.csv b/erpnext/translations/lv.csv
index cbf04855d02..b8499b28c12 100644
--- a/erpnext/translations/lv.csv
+++ b/erpnext/translations/lv.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitatīvas atsauksmes veidne,
Rules for applying different promotional schemes.,Noteikumi dažādu reklāmas shēmu piemērošanai.,
Shift,Maiņa,
Show {0},Rādīt {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Speciālās rakstzīmes, izņemot "-", "#", ".", "/", "{" Un "}", kas nav atļautas nosaukuma sērijās",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Speciālās rakstzīmes, izņemot "-", "#", ".", "/", "{{" Un "}}", kas nav atļautas nosaukuma sērijās {0}",
Target Details,Mērķa informācija,
{0} already has a Parent Procedure {1}.,{0} jau ir vecāku procedūra {1}.,
API,API,
diff --git a/erpnext/translations/mk.csv b/erpnext/translations/mk.csv
index 70080255346..8ecae03adc7 100644
--- a/erpnext/translations/mk.csv
+++ b/erpnext/translations/mk.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Шаблон за повратни информаци
Rules for applying different promotional schemes.,Правила за примена на различни промотивни шеми.,
Shift,Смена,
Show {0},Покажи {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Не се дозволени специјални карактери освен "-", "#", ".", "/", "{" И "}" во сериите за именување",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Не се дозволени специјални карактери освен "-", "#", ".", "/", "{{" И "}}" во сериите за именување {0}",
Target Details,Цели детали,
{0} already has a Parent Procedure {1}.,{0} веќе има Матична постапка {1}.,
API,API,
diff --git a/erpnext/translations/ml.csv b/erpnext/translations/ml.csv
index f917969345a..f649e6c83b7 100644
--- a/erpnext/translations/ml.csv
+++ b/erpnext/translations/ml.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,ഗുണനിലവാരമുള്ള ഫീഡ
Rules for applying different promotional schemes.,വ്യത്യസ്ത പ്രമോഷണൽ സ്കീമുകൾ പ്രയോഗിക്കുന്നതിനുള്ള നിയമങ്ങൾ.,
Shift,ഷിഫ്റ്റ്,
Show {0},{0} കാണിക്കുക,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{", "}" എന്നിവ ഒഴികെയുള്ള പ്രത്യേക പ്രതീകങ്ങൾ നാമകരണ ശ്രേണിയിൽ അനുവദനീയമല്ല",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{", "}}" എന്നിവ ഒഴികെയുള്ള പ്രത്യേക പ്രതീകങ്ങൾ നാമകരണ ശ്രേണിയിൽ അനുവദനീയമല്ല {0}",
Target Details,ടാർഗെറ്റ് വിശദാംശങ്ങൾ,
{0} already has a Parent Procedure {1}.,{0} ന് ഇതിനകം ഒരു രക്ഷാകർതൃ നടപടിക്രമം ഉണ്ട് {1}.,
API,API,
diff --git a/erpnext/translations/mr.csv b/erpnext/translations/mr.csv
index 9c41ce6f33d..38effc1b15a 100644
--- a/erpnext/translations/mr.csv
+++ b/erpnext/translations/mr.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,गुणवत्ता अभिप्राय ट
Rules for applying different promotional schemes.,वेगवेगळ्या जाहिरात योजना लागू करण्याचे नियम.,
Shift,शिफ्ट,
Show {0},दर्शवा {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" आणि "}" वगळता विशिष्ट वर्णांना नामांकन मालिकेमध्ये परवानगी नाही",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" आणि "}}" वगळता विशिष्ट वर्णांना नामांकन मालिकेमध्ये परवानगी नाही {0}",
Target Details,लक्ष्य तपशील,
{0} already has a Parent Procedure {1}.,{0} कडे आधीपासूनच पालक प्रक्रिया आहे {1}.,
API,API,
diff --git a/erpnext/translations/ms.csv b/erpnext/translations/ms.csv
index 1483844990e..4ee650b1046 100644
--- a/erpnext/translations/ms.csv
+++ b/erpnext/translations/ms.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Template Maklum Balas Kualiti,
Rules for applying different promotional schemes.,Kaedah untuk memohon skim promosi yang berbeza.,
Shift,Shift,
Show {0},Tunjukkan {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Watak Khas kecuali "-", "#", ".", "/", "{" Dan "}" tidak dibenarkan dalam siri penamaan",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Watak Khas kecuali "-", "#", ".", "/", "{{" Dan "}}" tidak dibenarkan dalam siri penamaan {0}",
Target Details,Butiran Sasaran,
{0} already has a Parent Procedure {1}.,{0} sudah mempunyai Tatacara Ibu Bapa {1}.,
API,API,
diff --git a/erpnext/translations/my.csv b/erpnext/translations/my.csv
index d15ec1ec711..f0d216bbc73 100644
--- a/erpnext/translations/my.csv
+++ b/erpnext/translations/my.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,အရည်အသွေးတုံ့ပြန်ခ
Rules for applying different promotional schemes.,ကွဲပြားခြားနားသောပရိုမိုးရှင်းအစီအစဉ်များလျှောက်ထားမှုအတွက်စည်းကမ်းများ။,
Shift,အဆိုင်း,
Show {0},Show ကို {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","မှလွဲ. အထူးဇာတ်ကောင် "-" "။ ", "#", "/", "{" နှင့် "}" စီးရီးနာမည်အတွက်ခွင့်မပြု",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","မှလွဲ. အထူးဇာတ်ကောင် "-" "။ ", "#", "/", "{{" နှင့် "}}" စီးရီးနာမည်အတွက်ခွင့်မပြု {0}",
Target Details,ပစ်မှတ်အသေးစိတ်,
{0} already has a Parent Procedure {1}.,{0} ပြီးသားမိဘလုပ်ထုံးလုပ်နည်း {1} ရှိပါတယ်။,
API,API ကို,
diff --git a/erpnext/translations/nl.csv b/erpnext/translations/nl.csv
index fbadc02327f..6ec43a05925 100644
--- a/erpnext/translations/nl.csv
+++ b/erpnext/translations/nl.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kwaliteitsfeedbacksjabloon,
Rules for applying different promotional schemes.,Regels voor het toepassen van verschillende promotieregelingen.,
Shift,Verschuiving,
Show {0},Toon {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Speciale tekens behalve "-", "#", ".", "/", "{" En "}" niet toegestaan in naamgevingsreeks",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Speciale tekens behalve "-", "#", ".", "/", "{{" En "}}" niet toegestaan in naamgevingsreeks {0}",
Target Details,Doelgegevens,
{0} already has a Parent Procedure {1}.,{0} heeft al een ouderprocedure {1}.,
API,API,
diff --git a/erpnext/translations/no.csv b/erpnext/translations/no.csv
index 150e5ca4a2e..df87e81db9f 100644
--- a/erpnext/translations/no.csv
+++ b/erpnext/translations/no.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitet Tilbakemelding Mal,
Rules for applying different promotional schemes.,Regler for anvendelse av forskjellige kampanjer.,
Shift,Skifte,
Show {0},Vis {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Spesialtegn unntatt "-", "#", ".", "/", "{" Og "}" ikke tillatt i navneserier",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Spesialtegn unntatt "-", "#", ".", "/", "{{" Og "}}" ikke tillatt i navneserier {0}",
Target Details,Måldetaljer,
{0} already has a Parent Procedure {1}.,{0} har allerede en foreldreprosedyre {1}.,
API,API,
diff --git a/erpnext/translations/pl.csv b/erpnext/translations/pl.csv
index 8340b7272fe..be81e29d7f1 100644
--- a/erpnext/translations/pl.csv
+++ b/erpnext/translations/pl.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Szablon opinii o jakości,
Rules for applying different promotional schemes.,Zasady stosowania różnych programów promocyjnych.,
Shift,Przesunięcie,
Show {0},Pokaż {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Znaki specjalne z wyjątkiem „-”, „#”, „.”, „/”, „{” I „}” niedozwolone w serii nazw",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Znaki specjalne z wyjątkiem "-", "#", "।", "/", "{{" I "}}" niedozwolone w serii nazw {0}",
Target Details,Szczegóły celu,
{0} already has a Parent Procedure {1}.,{0} ma już procedurę nadrzędną {1}.,
API,API,
diff --git a/erpnext/translations/ps.csv b/erpnext/translations/ps.csv
index 1dcaf48d792..68add60cc93 100644
--- a/erpnext/translations/ps.csv
+++ b/erpnext/translations/ps.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,د کیفیت فیډبیک ټیمپلیټ,
Rules for applying different promotional schemes.,د مختلف پروموشنل سکیمونو پلي کولو قواعد.,
Shift,شفټ,
Show {0},ښودل {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",ځانګړي نومونه د "-" ، "#" ، "." ، "/" ، "{" او "}" نوم لیکلو کې اجازه نه لري,
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} ځانګړي نومونه د "-" ، "#" ، "." ، "/" ، "{{" او "}}" نوم لیکلو کې اجازه نه لري,
Target Details,د هدف توضیحات,
{0} already has a Parent Procedure {1}.,{0} د مخه د والدین پروسیجر {1} لري.,
API,API,
diff --git a/erpnext/translations/pt-BR.csv b/erpnext/translations/pt-BR.csv
index 957cb75752e..cc1c6af9137 100644
--- a/erpnext/translations/pt-BR.csv
+++ b/erpnext/translations/pt-BR.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Modelo de Feedback de Qualidade,
Rules for applying different promotional schemes.,Regras para aplicar diferentes esquemas promocionais.,
Shift,Mudança,
Show {0},Mostrar {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caracteres especiais, exceto "-", "#", ".", "/", "{" e "}" não permitidos na série de nomenclatura",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caracteres especiais, exceto "-", "#", ".", "/", "{{" e "}}" não permitidos na série de nomenclatura {0}",
Target Details,Detalhes do Alvo,
{0} already has a Parent Procedure {1}.,{0} já tem um procedimento pai {1}.,
API,API,
diff --git a/erpnext/translations/pt.csv b/erpnext/translations/pt.csv
index 3b8a0a0f436..43bf227e673 100644
--- a/erpnext/translations/pt.csv
+++ b/erpnext/translations/pt.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Modelo de Feedback de Qualidade,
Rules for applying different promotional schemes.,Regras para aplicar diferentes esquemas promocionais.,
Shift,Mudança,
Show {0},Mostrar {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caracteres especiais, exceto "-", "#", ".", "/", "{" E "}" não permitidos na série de nomenclatura",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caracteres especiais, exceto "-", "#", ".", "/", "{{" E "}}" não permitidos na série de nomenclatura {0}",
Target Details,Detalhes do Alvo,
{0} already has a Parent Procedure {1}.,{0} já tem um procedimento pai {1}.,
API,API,
diff --git a/erpnext/translations/ro.csv b/erpnext/translations/ro.csv
index 643b8c5c3ed..3aab431cdd8 100644
--- a/erpnext/translations/ro.csv
+++ b/erpnext/translations/ro.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Șablon de feedback de calitate,
Rules for applying different promotional schemes.,Reguli pentru aplicarea diferitelor scheme promoționale.,
Shift,Schimb,
Show {0},Afișați {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caractere speciale, cu excepția "-", "#", ".", "/", "{" Și "}" nu sunt permise în numirea seriei",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caractere speciale, cu excepția "-", "#", ".", "/", "{{" Și "}}" nu sunt permise în numirea seriei {0}",
Target Details,Detalii despre țintă,
{0} already has a Parent Procedure {1}.,{0} are deja o procedură părinte {1}.,
API,API-ul,
diff --git a/erpnext/translations/ru.csv b/erpnext/translations/ru.csv
index 5f3af770cf1..662346f2e5d 100644
--- a/erpnext/translations/ru.csv
+++ b/erpnext/translations/ru.csv
@@ -3535,7 +3535,7 @@ Quality Feedback Template,Шаблон обратной связи по каче
Rules for applying different promotional schemes.,Правила применения разных рекламных схем.,
Shift,Сдвиг,
Show {0},Показать {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Специальные символы, кроме ""-"", ""#"", ""."", ""/"", ""{"" и ""}"", не допускаются в серийных номерах",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Специальные символы, кроме "-", "#", "।", "/", "{{" и "}}", не допускаются в серийных номерах {0}",
Target Details,Детали цели,
{0} already has a Parent Procedure {1}.,{0} уже имеет родительскую процедуру {1}.,
API,API,
diff --git a/erpnext/translations/rw.csv b/erpnext/translations/rw.csv
index 64591399afa..6c2b5ddb100 100644
--- a/erpnext/translations/rw.csv
+++ b/erpnext/translations/rw.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Inyandikorugero nziza,
Rules for applying different promotional schemes.,Amategeko yo gukoresha gahunda zitandukanye zo kwamamaza.,
Shift,Shift,
Show {0},Erekana {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Inyuguti zidasanzwe usibye "-", "#", ".", "/", "{" Na "}" ntibyemewe mu ruhererekane rwo kwita izina",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Inyuguti zidasanzwe usibye "-", "#", ".", "/", "{{" Na "}}" ntibyemewe mu ruhererekane rwo kwita izina {0}",
Target Details,Intego Ibisobanuro,
{0} already has a Parent Procedure {1}.,{0} isanzwe ifite uburyo bwababyeyi {1}.,
API,API,
diff --git a/erpnext/translations/si.csv b/erpnext/translations/si.csv
index 690c47332d6..5b7823589a4 100644
--- a/erpnext/translations/si.csv
+++ b/erpnext/translations/si.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,ගුණාත්මක ප්රතිපෝෂ
Rules for applying different promotional schemes.,විවිධ ප්රවර්ධන යෝජනා ක්රම යෙදීම සඳහා නීති.,
Shift,මාරුව,
Show {0},{0 Show පෙන්වන්න,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" සහ "}" හැර විශේෂ අක්ෂර නම් කිරීමේ ශ්රේණියේ අවසර නැත",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" සහ "}}" හැර විශේෂ අක්ෂර නම් කිරීමේ ශ්රේණියේ අවසර නැත {0}",
Target Details,ඉලක්ක විස්තර,
{0} already has a Parent Procedure {1}.,{0} දැනටමත් දෙමාපිය ක්රියා පටිපාටියක් ඇත {1}.,
API,API,
diff --git a/erpnext/translations/sk.csv b/erpnext/translations/sk.csv
index cb4a7fed4b9..446e0be58b7 100644
--- a/erpnext/translations/sk.csv
+++ b/erpnext/translations/sk.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Šablóna spätnej väzby kvality,
Rules for applying different promotional schemes.,Pravidlá uplatňovania rôznych propagačných programov.,
Shift,smena,
Show {0},Zobraziť {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Špeciálne znaky s výnimkou „-“, „#“, „.“, „/“, „{“ A „}“ nie sú v názvových sériách povolené.",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Špeciálne znaky s výnimkou "-", "#", "।", "/", "{{" A "}}" nie sú v názvových sériách povolené {0}.",
Target Details,Podrobnosti o cieli,
{0} already has a Parent Procedure {1}.,{0} už má rodičovský postup {1}.,
API,API,
diff --git a/erpnext/translations/sl.csv b/erpnext/translations/sl.csv
index 8beec6be16a..8b8ed011147 100644
--- a/erpnext/translations/sl.csv
+++ b/erpnext/translations/sl.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Predloga za povratne informacije o kakovosti,
Rules for applying different promotional schemes.,Pravila za uporabo različnih promocijskih shem.,
Shift,Shift,
Show {0},Prikaži {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Posebni znaki, razen "-", "#", ".", "/", "{" In "}" v poimenovanju ni dovoljen",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Posebni znaki, razen "-", "#", ".", "/", "{{" In "}}" v poimenovanju ni dovoljen {0}",
Target Details,Podrobnosti cilja,
{0} already has a Parent Procedure {1}.,{0} že ima nadrejeni postopek {1}.,
API,API,
diff --git a/erpnext/translations/sq.csv b/erpnext/translations/sq.csv
index 05aefa3602b..6f4f8e01359 100644
--- a/erpnext/translations/sq.csv
+++ b/erpnext/translations/sq.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Modeli i reagimit të cilësisë,
Rules for applying different promotional schemes.,Rregulla për aplikimin e skemave të ndryshme promovuese.,
Shift,ndryshim,
Show {0},Trego {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Karaktere speciale përveç "-", "#", ".", "/", "{" Dhe "}" nuk lejohen në seritë emërtuese",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Karaktere speciale përveç "-", "#", ".", "/", "{{" Dhe "}}" nuk lejohen në seritë emërtuese {0}",
Target Details,Detaje të synuara,
{0} already has a Parent Procedure {1}.,{0} tashmë ka një procedurë prindërore {1}.,
API,API,
diff --git a/erpnext/translations/sr.csv b/erpnext/translations/sr.csv
index b507f74f095..853c6f3ccce 100644
--- a/erpnext/translations/sr.csv
+++ b/erpnext/translations/sr.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Квалитетни образац за поврат
Rules for applying different promotional schemes.,Правила за примену различитих промотивних шема.,
Shift,Смена,
Show {0},Прикажи {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Посебни знакови осим "-", "#", ".", "/", "{" И "}" нису дозвољени у именовању серија",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Посебни знакови осим "-", "#", ".", "/", "{{" И "}}" нису дозвољени у именовању серија {0}",
Target Details,Детаљи циља,
{0} already has a Parent Procedure {1}.,{0} већ има родитељску процедуру {1}.,
API,АПИ,
diff --git a/erpnext/translations/sv.csv b/erpnext/translations/sv.csv
index 57e02792f44..2a4d6b1fbd3 100644
--- a/erpnext/translations/sv.csv
+++ b/erpnext/translations/sv.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitetsåterkopplingsmall,
Rules for applying different promotional schemes.,Regler för tillämpning av olika kampanjprogram.,
Shift,Flytta,
Show {0},Visa {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Specialtecken utom "-", "#", ".", "/", "{" Och "}" är inte tillåtna i namnserien",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Specialtecken utom "-", "#", ".", "/", "{{" Och "}}" är inte tillåtna i namnserien {0}",
Target Details,Måldetaljer,
{0} already has a Parent Procedure {1}.,{0} har redan en överordnad procedur {1}.,
API,API,
diff --git a/erpnext/translations/sw.csv b/erpnext/translations/sw.csv
index 3595727666a..234d33e1066 100644
--- a/erpnext/translations/sw.csv
+++ b/erpnext/translations/sw.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kiolezo cha Maoni ya Ubora,
Rules for applying different promotional schemes.,Sheria za kutumia miradi tofauti ya uendelezaji.,
Shift,Shift,
Show {0},Onyesha {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Tabia maalum isipokuwa "-", "#", ".", "/", "{" Na "}" hairuhusiwi katika kutaja mfululizo",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Tabia maalum isipokuwa "-", "#", ".", "/", "{{" Na "}}" hairuhusiwi katika kutaja mfululizo {0}",
Target Details,Maelezo ya Lengo,
{0} already has a Parent Procedure {1}.,{0} tayari ina Utaratibu wa Mzazi {1}.,
API,API,
diff --git a/erpnext/translations/ta.csv b/erpnext/translations/ta.csv
index 100f0e9300b..e7384b36efc 100644
--- a/erpnext/translations/ta.csv
+++ b/erpnext/translations/ta.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,தரமான கருத்து வார்ப
Rules for applying different promotional schemes.,வெவ்வேறு விளம்பர திட்டங்களைப் பயன்படுத்துவதற்கான விதிகள்.,
Shift,ஷிப்ட்,
Show {0},{0 Show ஐக் காட்டு,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" மற்றும் "}" தவிர சிறப்பு எழுத்துக்கள் பெயரிடும் தொடரில் அனுமதிக்கப்படவில்லை",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" மற்றும் "}}" தவிர சிறப்பு எழுத்துக்கள் பெயரிடும் தொடரில் அனுமதிக்கப்படவில்லை {0}",
Target Details,இலக்கு விவரங்கள்,
{0} already has a Parent Procedure {1}.,{0} ஏற்கனவே பெற்றோர் நடைமுறை {1 has ஐக் கொண்டுள்ளது.,
API,ஏபிஐ,
diff --git a/erpnext/translations/te.csv b/erpnext/translations/te.csv
index 047d07731e5..cd14a773108 100644
--- a/erpnext/translations/te.csv
+++ b/erpnext/translations/te.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,నాణ్యమైన అభిప్రాయ మ
Rules for applying different promotional schemes.,విభిన్న ప్రచార పథకాలను వర్తింపజేయడానికి నియమాలు.,
Shift,మార్పు,
Show {0},{0 Show చూపించు,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" మరియు "}" మినహా ప్రత్యేక అక్షరాలు పేరు పెట్టే సిరీస్లో అనుమతించబడవు",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" మరియు "}}" మినహా ప్రత్యేక అక్షరాలు పేరు పెట్టే సిరీస్లో అనుమతించబడవు {0}",
Target Details,లక్ష్య వివరాలు,
{0} already has a Parent Procedure {1}.,{0} ఇప్పటికే తల్లిదండ్రుల విధానం {1 has ను కలిగి ఉంది.,
API,API,
diff --git a/erpnext/translations/th.csv b/erpnext/translations/th.csv
index 71233ec8fa0..4ab59bc8e1a 100644
--- a/erpnext/translations/th.csv
+++ b/erpnext/translations/th.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,เทมเพลตข้อเสนอแนะค
Rules for applying different promotional schemes.,กฎสำหรับการใช้รูปแบบการส่งเสริมการขายต่าง ๆ,
Shift,เปลี่ยน,
Show {0},แสดง {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","ห้ามใช้อักขระพิเศษยกเว้น "-", "#", ".", "/", "{" และ "}" ในซีรี่ส์",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","ห้ามใช้อักขระพิเศษยกเว้น "-", "#", ".", "/", "{{" และ "}}" ในซีรี่ส์ {0}",
Target Details,รายละเอียดเป้าหมาย,
{0} already has a Parent Procedure {1}.,{0} มี parent Parent {1} อยู่แล้ว,
API,API,
diff --git a/erpnext/translations/tr.csv b/erpnext/translations/tr.csv
index 9e7ba4d1421..b65494ce32b 100644
--- a/erpnext/translations/tr.csv
+++ b/erpnext/translations/tr.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Kalite Geribildirim Şablonu,
Rules for applying different promotional schemes.,Farklı promosyon programlarını uygulama kuralları.,
Shift,vardiya,
Show {0},{0} göster,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" Ve "}" dışındaki Özel Karakterler, seri dizisine izin verilmez",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" Ve "}}" dışındaki Özel Karakterler, seri dizisine izin verilmez {0}",
Target Details,Hedef Detayları,
{0} already has a Parent Procedure {1}.,{0} zaten bir {1} veli prosedürüne sahip.,
API,API,
diff --git a/erpnext/translations/uk.csv b/erpnext/translations/uk.csv
index 53e2df518cf..4e2f63f870e 100644
--- a/erpnext/translations/uk.csv
+++ b/erpnext/translations/uk.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Шаблон зворотнього зв'язку
Rules for applying different promotional schemes.,Правила застосування різних рекламних схем.,
Shift,Зміна,
Show {0},Показати {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Спеціальні символи, окрім "-", "#", ".", "/", "{" Та "}", не дозволяються в іменуванні серій",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Спеціальні символи, окрім "-", "#", ".", "/", "{{" Та "}}", не дозволяються в іменуванні серій {0}",
Target Details,Деталі цілі,
{0} already has a Parent Procedure {1}.,{0} вже має батьківську процедуру {1}.,
API,API,
diff --git a/erpnext/translations/ur.csv b/erpnext/translations/ur.csv
index aaaef5895ff..db6518e86b0 100644
--- a/erpnext/translations/ur.csv
+++ b/erpnext/translations/ur.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,کوالٹی فیڈ بیک ٹیمپلیٹ۔,
Rules for applying different promotional schemes.,مختلف پروموشنل اسکیموں کو لاگو کرنے کے قواعد۔,
Shift,شفٹ۔,
Show {0},دکھائیں {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","-" ، "#" ، "." ، "/" ، "{" اور "}" سوائے خصوصی حروف کی نام بندی سیریز میں اجازت نہیں ہے,
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} "-" ، "#" ، "." ، "/" ، "{{" اور "}}" سوائے خصوصی حروف کی نام بندی سیریز میں اجازت نہیں ہے,
Target Details,ہدف کی تفصیلات۔,
{0} already has a Parent Procedure {1}.,{0} پہلے سے ہی والدین کا طریقہ کار {1} ہے.,
API,API,
diff --git a/erpnext/translations/uz.csv b/erpnext/translations/uz.csv
index c983797aae1..bb64a15f2b7 100644
--- a/erpnext/translations/uz.csv
+++ b/erpnext/translations/uz.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Sifat bo'yicha fikrlar shablonlari,
Rules for applying different promotional schemes.,Turli reklama sxemalarini qo'llash qoidalari.,
Shift,Shift,
Show {0},{0} ni ko'rsatish,
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" Va "}" belgilaridan tashqari maxsus belgilarga ruxsat berilmaydi.",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" Va "}}" belgilaridan tashqari maxsus belgilarga ruxsat berilmaydi {0}.",
Target Details,Maqsad tafsilotlari,
{0} already has a Parent Procedure {1}.,{0} allaqachon Ota-ona tartibiga ega {1}.,
API,API,
diff --git a/erpnext/translations/vi.csv b/erpnext/translations/vi.csv
index 03ff2ccc38d..7317b4b0275 100644
--- a/erpnext/translations/vi.csv
+++ b/erpnext/translations/vi.csv
@@ -3537,7 +3537,7 @@ Quality Feedback Template,Mẫu phản hồi chất lượng,
Rules for applying different promotional schemes.,Quy tắc áp dụng các chương trình khuyến mãi khác nhau.,
Shift,Ca,
Show {0},Hiển thị {0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Các ký tự đặc biệt ngoại trừ "-", "#", ".", "/", "{" Và "}" không được phép trong chuỗi đặt tên",
+"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Các ký tự đặc biệt ngoại trừ "-", "#", ".", "/", "{{" Và "}}" không được phép trong chuỗi đặt tên {0}",
Target Details,Chi tiết mục tiêu,
{0} already has a Parent Procedure {1}.,{0} đã có Quy trình dành cho phụ huynh {1}.,
API,API,
diff --git a/erpnext/translations/zh.csv b/erpnext/translations/zh.csv
index d1f1b07f118..2337bcb4da9 100644
--- a/erpnext/translations/zh.csv
+++ b/erpnext/translations/zh.csv
@@ -3537,7 +3537,6 @@ Quality Feedback Template,质量反馈模板,
Rules for applying different promotional schemes.,适用不同促销计划的规则。,
Shift,转移,
Show {0},显示{0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",命名系列中不允许使用除“ - ”,“#”,“。”,“/”,“{”和“}”之外的特殊字符,
Target Details,目标细节,
{0} already has a Parent Procedure {1}.,{0}已有父程序{1}。,
API,应用程序界面,
diff --git a/erpnext/translations/zh_tw.csv b/erpnext/translations/zh_tw.csv
index 1cc7d8773ee..1b7e18637d3 100644
--- a/erpnext/translations/zh_tw.csv
+++ b/erpnext/translations/zh_tw.csv
@@ -3311,7 +3311,6 @@ Quality Feedback Template,質量反饋模板,
Rules for applying different promotional schemes.,適用不同促銷計劃的規則。,
Shift,轉移,
Show {0},顯示{0},
-"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",命名系列中不允許使用除“ - ”,“#”,“。”,“/”,“{”和“}”之外的特殊字符,
Target Details,目標細節,
API,API,
Annual,年刊,